2014-12-12 2 views
2

У меня есть запрос GET Ajax, который возвращает мне контент, закодированный в форме application/pdf. Например, мои просьбы возвращает строку такого типа:Открыть pdf-материал в новой вкладке браузера

% PDF-1.4% 4 0 объект <> поток х endstream endobj 6 0 объект <> Поток х ] o 0 + e {Q $ R N @ - n wBL $ .JDL | > 獝 [ > {= _'(寒 1`ؚ yWGXϽo16Ӳ.4 (uC8jHl f6 * k Fa^e G = J0 } 7L z p H & ɴ L Z

Извините, что у меня есть специальные символы: проблема заключается именно в этом. Я хотел бы получить этот ответ, полученный по моему запросу, и правильно напечатать этот контент на другой вкладке браузера. Я написал код для этого: я использовал объект Blob. Открыта страница для «чтения pdf». Тем не менее, я вижу только документ в формате PDF, который является полностью белым, что свидетельствует о том, что мой ответ не был записан в документе, который был создан.

Ниже я покажу вам код моего запроса:

$.ajax({ 
    type: "GET", 
    url:urll + parameter, 
    async: true, 
    crossDomain: true, 
    accept: { 
      pdf: 'application/pdf' 
    }, 
    success:function(response, status, xhr){ 

     alert("Response: "+response); 
     alert("Status: "+status); 
     alert("Xhr: "+xhr); 

     // check for a filename 
     var filename = ""; 
     var disposition = xhr.getResponseHeader('Content-Disposition'); 
     if (disposition && disposition.indexOf('attachment') !== -1) { 
      var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/; 
      var matches = filenameRegex.exec(disposition); 
      if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, ''); 
     } 

     var type = xhr.getResponseHeader('Content-Type'); 
     var blob = new Blob([response], { type: type }); 

     if (typeof window.navigator.msSaveBlob !== 'undefined') { 
      // IE workaround for "HTML7007: One or more blob URLs were revoked by closing the blob for which they were created. These URLs will no longer resolve as the data backing the URL has been freed." 
      window.navigator.msSaveBlob(blob, filename); 
     } else { 
      var URL = window.URL || window.webkitURL; 
      var downloadUrl = URL.createObjectURL(blob); 

      if (filename) { 
       // use HTML5 a[download] attribute to specify filename 
       var a = document.createElement("a"); 
       // safari doesn't support this yet 
       if (typeof a.download === 'undefined') { 
        //window.location = downloadUrl; 
        window.open(downloadUrl, '_blank'); 
       } else {       
        a.href = downloadUrl; 
        a.download = filename; 
        document.body.appendChild(a); 
        a.setAttribute("target","_blank"); 
        a.click(); 
       } 
      } else { 
       //window.location = downloadUrl; 
       window.open(downloadUrl, '_blank'); 
      } 

      setTimeout(function() { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup 
     } 
    }, 
    error: function(xhr,status,error){ 
     alert("error "+xhr+" "+error+" "+status); 
    } 
}); 
+0

Это дубликат [this] (http://stackoverflow.com/questions/22268167/how-to-display-pdf-or-any-document -from-server-in-a-new-browser-window-throug)? –

ответ

0

Как я понимаю, вы используете GET и нужен файл в формате PDF в новой вкладке. Soo ... Почему бы вам не просто открыть этот адрес в новом окне, как этот

var fullUrl = urll + parameter; 
window.open(fullUrl); 
+0

Поскольку браузер пытается открыть эту ссылку с помощью приложения заголовка/xml, вместо приложения/pdf, так что дайте ошибку. – user140888

+0

@ user140888 Как я понимаю, этот удаленный сервер отправляет данные в «application/xml» даже после того, как вы установили «Accept: application/pdf». Более того, этот удаленный сервер не принадлежит вам, и вы не можете изменить заголовки содержимого ответа. Кроме того, вы не можете написать страницу с PHP (или другим языковым сервером), которая сделает запрос на получение и вернет содержимое с другим типом контента. –

+0

@ user140888 Btw, команда $ .ajax имеет атрибут «принимает», но не «принимает». Вы ошиблись. Разве это не может быть причиной неправильного типа контента? –

0

У меня была аналогичная проблема с использованием AngularJS (оба $ ресурса и $ HTTP). Решение в моем случае состояло в том, чтобы установить responseType: 'arraybuffer'. Это часть XMLHttpRequest (см. https://xhr.spec.whatwg.org/#interface-xmlhttprequest), но она не отображается jQuery.

Вы можете добавить его в JQuery с помощью этого плагина: https://github.com/henrya/js-jquery/tree/master/BinaryTransport

Как я уже сказал, это то, что работает для меня в AngularJS. Надеюсь, это решение, которое вы ищите :)

+0

Привет, Не могли бы вы разместить свой обратный вызов в угловом, потому что мне нужно открыть CSV для загрузки в браузере, и, может быть, ваш код для этого хорошо :) –

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