Подтвердить что ты не робот

Правильное создание и обслуживание PDF-блогов с помощью HTML5 файлов и API-интерфейсов URL-адресов

Хорошо, скажем, у меня есть данные документа, которые где-то хранятся, пусть произвольно возьмет этот pdf.

Проблема №1. Я хочу сделать вызов AJAX для этого URL (потому что мне нужно передать некоторые заголовки аутентификации, и это перекрестный домен). Затем возьмите возвращаемые данные, создайте blob url для этого, добавьте iFrame в DOM и направьте src на url blob.

В настоящее время мой код выглядит следующим образом:

$.ajax({
  url:'http://www.grida.no/climate/ipcc_tar/wg1/pdf/tar-01.pdf'
}).done(function(data){
   var file = new Blob([data], {type:'application/pdf'}),
       url = URL.createObjectURL(file),
       _iFrame = document.createElement('iframe');
      _iFrame.setAttribute('src', url);
      _iFrame.setAttribute('style', 'visibility:hidden;');
      $('#someDiv').append(_iFrame);
});

К сожалению, я получаю сообщение "Failed to Render PDF" в iFrame.

Проблема №2. Я бы хотел, чтобы это привело к запросу загрузки файла. Не уверен, как гарантировать это, учитывая, что PDF естественно будет отображаться в iFrame.

4b9b3361

Ответ 1

jQuery.ajax в настоящее время не поддерживает BLOB-объекты, см. этот отчет об ошибке # 7248, который закрыт как wontfix.

Однако легко сделать XHR для больших двоичных объектов без jQuery:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://www.grida.no/climate/ipcc_tar/wg1/pdf/tar-01.pdf', true);
xhr.responseType = 'blob';

xhr.onload = function(e) {
  if (this.status == 200) {
    // Note: .response instead of .responseText
    var blob = new Blob([this.response], {type: 'application/pdf'}),
        url = URL.createObjectURL(blob),
        _iFrame = document.createElement('iframe');

    _iFrame.setAttribute('src', url);
    _iFrame.setAttribute('style', 'visibility:hidden;');
    $('#someDiv').append(_iFrame)        
  }
};

xhr.send();

Бесстыдно скопировано с HTML5rocks.

Если jQuery поддерживает тип Blob, это может быть так просто:

$.ajax({
  url:'http://www.grida.no/climate/ipcc_tar/wg1/pdf/tar-01.pdf',
  dataType:'blob'
})...

Ответ 2

Я использовал @Ciantic answer, чтобы адаптировать свой ответ. Я избегал использования iframe obj, и пользователь может загрузить файл прямо со страницы.

var link = 'http://www.grida.no/climate/ipcc_tar/wg1/pdf/tar-01.pdf';
$("body").addClass("loading"); // adding the loading spinner class

var xhr = new XMLHttpRequest();
xhr.open('GET',link,true);
xhr.responseType = 'blob';

        xhr.onload = function(e){
                 if (this.status == 200) {
                    var a = document.createElement('a');
                    var url = window.URL.createObjectURL(new Blob([this.response], {type: 'application/pdf'}));
                    a.href = url;
                    a.download = 'report.pdf';
                    a.click();
                    window.URL.revokeObjectURL(url);
                    $('body').removeClass("loading"); //removing the loading spinner class
                  }else{
                      $('body').removeClass("loading") //removing the loading spinner class
                      console.log(this.status);
                      alert('Download failed...!  Please Try again!!!');
                  }
            };
            xhr.send();

Ответ 3

var src_url = your url here;
var contentDisposition = 'AlwaysInline';
var src_new = src_url.replace(/(ContentDisposition=).*?(&)/, '$1' + contentDisposition + '$2');

Сделав это, вы сможете просматривать PDF, а не загружать его,

Заголовок ContentDisposition должен иметь значение AlwaysInline, тогда только он отображает ваш файл, а не загружает его.