2015-11-23 3 views
0

Попытки загрузить PDF-документ с Угловым, мы писали это:Скачать PDF с Угловыми

var _config = { headers : {'Accept' : '*/*'}, 
       responseType : 'arraybuffer' 
       }; 

var success = function(data, status, header, config) { 
    $log.debug('Download resume success - type:' + typeof (data)); 
    var _contentType = (header('Content-Type')); 
    var blob = new Blob([ data ], { type : _contentType }); 
    var url = (window.URL || window.webkitURL).createObjectURL(blob); 
    var anchor = angular.element('<a/>'); 
    anchor.attr({ 
     href : url, 
     target : '_blank', 
     download : _fileName 
    })[0].click(); 
} 
$http.get(_url, _config).success(success).error(error); 

Мы перепробовали все перестановки сгустка и ArrayBuffer но data всегда возвращается в виде строки с расширенными символами «расшифрованных «то есть сломанный.

_contentType всегда application/pdf, хотя мы попытались сделать его application/octet-stream.

Предложения и указатели приветствуются!

Update

Это выглядит как ошибка где-то между угловым (1.3.15 & 1.4.8) и реализациями (46,0) XMLHttpRequest Chrome, где response.data всегда возвращаются как 'декодированного' строки. Ни у Firefox (42), ни у IE (10) нет этой проблемы, и все нижеприведенные решения, скорее всего, будут работать (как это делает или оригинальное решение).

Я сообщил об этом как о возможной ошибке как для AngularJS & Chrome.

+0

Вот парень, который сделал это. http://stackoverflow.com/a/23683763/652728 –

+0

Да, почему это не работает прямолинейно? Похоже, должно. –

+0

Любая причина, по которой вы создаете ссылку, а не просто window.location()? –

ответ

0

Просто измените его из HTML:

<a target="_self" href="example.com/uploads/file.pdf" download="file_new_name.pdf"> 
+2

Это будет работать, если файл не находится за защищенным API REST. –

+0

Что делать, если вы задаете заголовок: $ http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w'; – FRECIA

+1

Нет, это намного сложнее. Мы интегрированы с Spring Security. –

1

Я побежал в этой проблеме я несколько месяцев назад. Мне пришлось использовать FileSaver.js для его обработки.

Так после установки FileSaver.js ваш успех функции выглядеть примерно так:

function success(response) { 
    var blob = new Blob([response.data], { type: "application/pdf"}); 
    //change download.pdf to the name of whatever you want your file to be 
    saveAs(blob, "download.pdf"); 
} 
+0

Мы пробовали FileSaver.js, нет разницы. Один вопрос, который у меня есть с FileSaver: откуда я знаю, что Blob обрабатывается FileSaver, а не встроенным Blob? –

+0

Что вы используете в бэкэнде? У меня также были проблемы с моим узлом/экспресс-сервером, повреждающим мои данные zip. Мне пришлось fs.writeFile на временный файл на сервере, затем res.download (pathOfFile, filename + ".zip"); И это сработало. – dethstrobe

+0

Весна - наш бэкэнд. Файл изменяется только тогда, когда он попадает на Угловое, когда мы проверяем объект 'data'. По проводу это нормально. GET с другого сервера Spring отлично. GET из Postman сохраняет файл на диск, и он не поврежден. Единственный раз, когда у нас возникают проблемы, мы пытаемся загрузить его нашему угловому клиенту :-( –

0

Проверить кодирование с помощью API и в этой линии, это работает для меня:

  var filepdf = Base64.encode(response.data); 
      $scope.filepdf = 'data:application/pdf;base64,' + pdfdata; 

КОНТРОЛЛЕР

$scope.pdfDownloads = function() { 
     DownloadPath.get({id: $rootScope.user.account_id}, function (data) { 
      $scope.createtext = "Download PDF file"; 
      $scope.download_pdf_filename = data.filename; 
      $scope.getPdf = true; 
      $scope.download_dir = file_url; 

      $http.get($scope.download_dir).then(function (response) { 
       var pdfdata= Base64.encode(response.data); 
       $scope.pdfdata= 'data:application/pdf;base64,' + pdfdata; 
       $('#pdfanchor').attr({ 
        href: $scope.pdfdata, 
        download: $scope.download_pdf_filename 
       }) 
      });      
     }); 
    }; 

HTML

<a href=""ng-click="pdfDownloads()" >Download</a> 

EDIT: ЭТО КАК МЫ СТРУКТУРИРОВАННОЕ МЕР (PHP функции)

contentType = 'application/octet-stream'; 
contentDescription = 'File Transfer'; 
contentDisposition = 'attachment; filename=' . basename(file_nae); 
expires = 0; 
cacheControl = 'must-revalidate'; 
contentLength = filesize($file_name); 
body = base64_encode(file_get_contents($file_name)); 
+0

Это будет работать, если мы base64 закодировали файл до его отправки, но мы этого не сделаем. Файл является необработанным (двоичным) файлом PDF. –

+0

Но что можно сделать правильно? просто кодировать перед ответом ?? : | – FRECIA

+0

Честно говоря, это было для меня проблемой, в конце концов мы решили изменить ответ api .... не идеально – FRECIA

Смежные вопросы