Я пытаюсь отобразить pdf файл, который я получаю как blob из ответа $http.post
. PDF файл должен отображаться в приложении с помощью <embed src>
, например.
Я столкнулся с несколькими сообщениями о стеках, но некоторые, как мой пример, похоже, не работают.
JS:
в соответствии с этим документом, я продолжал и пробовал...
$http.post('/postUrlHere',{myParams}).success(function (response) {
var file = new Blob([response], {type: 'application/pdf'});
var fileURL = URL.createObjectURL(file);
$scope.content = fileURL;
});
Теперь, из того, что я понимаю, fileURL
создает временный URL-адрес, который блог может использовать как refference.
HTML:
<embed src="{{content}}" width="200" height="200"></embed>
Я не уверен, как справиться с этим в angular, идеальной ситуацией будет (1) присвоить область видимости, (2) "подготовить/rebuild 'blob to pdf (3) передать его в HTML с помощью <embed>
, поэтому я хочу отобразить его в приложении.
Я занимаюсь исследованиями уже более дня, но некоторые, как мне кажется, не понимают, как это работает в angular.. и позволяют просто предположить, что библиотеки библиотек pdf там не были доступны.
Ответ 1
Прежде всего вам нужно установить responseType
в arraybuffer
. Это необходимо, если вы хотите создать капли ваших данных. См. Sending_and_Receiving_Binary_Data. Таким образом, ваш код будет выглядеть так:
$http.post('/postUrlHere',{myParams}, {responseType:'arraybuffer'})
.success(function (response) {
var file = new Blob([response], {type: 'application/pdf'});
var fileURL = URL.createObjectURL(file);
});
В следующей части вам нужно использовать службу $sce, чтобы сделать angular доверенным вашим URL. Это можно сделать следующим образом:
$scope.content = $sce.trustAsResourceUrl(fileURL);
Не забудьте ввести $sce службу.
Если это все сделано, вы можете теперь вставить свой pdf:
<embed ng-src="{{content}}" style="width:200px;height:200px;"></embed>
Ответ 2
Я использую AngularJS v1.3.4
HTML:
<button ng-click="downloadPdf()" class="btn btn-primary">download PDF</button>
JS-контроллер:
'use strict';
angular.module('xxxxxxxxApp')
.controller('xxxxController', function ($scope, xxxxServicePDF) {
$scope.downloadPdf = function () {
var fileName = "test.pdf";
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
xxxxServicePDF.downloadPdf().then(function (result) {
var file = new Blob([result.data], {type: 'application/pdf'});
var fileURL = window.URL.createObjectURL(file);
a.href = fileURL;
a.download = fileName;
a.click();
});
};
});
Услуги JS:
angular.module('xxxxxxxxApp')
.factory('xxxxServicePDF', function ($http) {
return {
downloadPdf: function () {
return $http.get('api/downloadPDF', { responseType: 'arraybuffer' }).then(function (response) {
return response;
});
}
};
});
Java REST Web Services - Spring MVC:
@RequestMapping(value = "/downloadPDF", method = RequestMethod.GET, produces = "application/pdf")
public ResponseEntity<byte[]> getPDF() {
FileInputStream fileStream;
try {
fileStream = new FileInputStream(new File("C:\\xxxxx\\xxxxxx\\test.pdf"));
byte[] contents = IOUtils.toByteArray(fileStream);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType("application/pdf"));
String filename = "test.pdf";
headers.setContentDispositionFormData(filename, filename);
ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(contents, headers, HttpStatus.OK);
return response;
} catch (FileNotFoundException e) {
System.err.println(e);
} catch (IOException e) {
System.err.println(e);
}
return null;
}
Ответ 3
Майкл предложения работает как очарование для меня:)
Если вы замените $http.post на $http.get, помните, что метод .get принимает 2 параметра вместо 3... вот где пропало мое время...;)
контроллер:
$http.get('/getdoc/' + $stateParams.id,
{responseType:'arraybuffer'})
.success(function (response) {
var file = new Blob([(response)], {type: 'application/pdf'});
var fileURL = URL.createObjectURL(file);
$scope.content = $sce.trustAsResourceUrl(fileURL);
});
Вид:
<object ng-show="content" data="{{content}}" type="application/pdf" style="width: 100%; height: 400px;"></object>
Ответ 4
Мне пришлось сталкиваться с трудностями с использованием "window.URL" с браузером Opera, поскольку это привело бы к "undefined". Кроме того, с window.URL, документ PDF никогда не открывался в Internet Explorer и Microsoft Edge (он оставался бы в ожидании навсегда). Я придумал следующее решение, которое работает в IE, Edge, Firefox, Chrome и Opera (не протестировано с Safari):
$http.post(postUrl, data, {responseType: 'arraybuffer'})
.success(success).error(failed);
function success(data) {
openPDF(data.data, "myPDFdoc.pdf");
};
function failed(error) {...};
function openPDF(resData, fileName) {
var ieEDGE = navigator.userAgent.match(/Edge/g);
var ie = navigator.userAgent.match(/.NET/g); // IE 11+
var oldIE = navigator.userAgent.match(/MSIE/g);
var blob = new window.Blob([resData], { type: 'application/pdf' });
if (ie || oldIE || ieEDGE) {
window.navigator.msSaveBlob(blob, fileName);
}
else {
var reader = new window.FileReader();
reader.onloadend = function () {
window.location.href = reader.result;
};
reader.readAsDataURL(blob);
}
}
Сообщите мне, помогло ли это!:)
Ответ 5
Добавление responseType в запрос, сделанный из angular, действительно является решением, но для меня это не сработало, пока я не установил responseType в blob, а не arrayBuffer. Код сам по себе поясняет:
$http({
method : 'GET',
url : 'api/paperAttachments/download/' + id,
responseType: "blob"
}).then(function successCallback(response) {
console.log(response);
var blob = new Blob([response.data]);
FileSaver.saveAs(blob, getFileNameFromHttpResponse(response));
}, function errorCallback(response) {
});
Ответ 6
Я боролся за последние пару дней, пытаясь загрузить pdf файлы и изображения, все, что мне удалось скачать, было простым текстовым файлом.
Большинство вопросов имеют одни и те же компоненты, но потребовалось некоторое время, чтобы выяснить правильный порядок, чтобы заставить его работать.
Спасибо @Николай Мельников, ваш комментарий/ответ на этот вопрос был тем, что заставило его работать.
Вкратце, вот мой брандмауэр службы AngularJS:
getDownloadUrl(fileID){
//
//Get the download url of the file
let fullPath = this.paths.downloadServerURL + fileId;
//
// return the file as arraybuffer
return this.$http.get(fullPath, {
headers: {
'Authorization': 'Bearer ' + this.sessionService.getToken()
},
responseType: 'arraybuffer'
});
}
От моего контроллера:
downloadFile(){
myService.getDownloadUrl(idOfTheFile).then( (response) => {
//Create a new blob object
let myBlobObject=new Blob([response.data],{ type:'application/pdf'});
//Ideally the mime type can change based on the file extension
//let myBlobObject=new Blob([response.data],{ type: mimeType});
var url = window.URL || window.webkitURL
var fileURL = url.createObjectURL(myBlobObject);
var downloadLink = angular.element('<a></a>');
downloadLink.attr('href',fileURL);
downloadLink.attr('download',this.myFilesObj[documentId].name);
downloadLink.attr('target','_self');
downloadLink[0].click();//call click function
url.revokeObjectURL(fileURL);//revoke the object from URL
});
}