2016-01-04 767 views
16

我想爲jquery ajax響應下載pdf文件。 Ajax響應包含pdf文件數據。我試過這個solution。我的代碼如下,但我總是得到一個空白的PDF。使用jquery ajax下載pdf文件

$(document).on('click', '.download-ss-btn', function() { 

    $.ajax({ 
     type: "POST", 
     url: 'http://127.0.0.1:8080/utils/json/pdfGen', 
     data: { 
      data: JSON.stringify(jsonData) 
     } 

    }).done(function (data) { 
     var blob = new Blob([data]); 
     var link = document.createElement('a'); 
     link.href = window.URL.createObjectURL(blob); 
     link.download = "Sample.pdf"; 
     link.click(); 
    }); 


}); 
+0

嘗試替換'XMLHttpRequest'爲'jQuery.ajax()'見http://stackoverflow.com/questions/12876000/how-to-build-pdf-file-from-binary-string-returned- from-a-web-service-using-javas – guest271314

+1

爲什麼你需要爲此使用AJAX?如果沒有它,下載文件就更加容易和可靠。 –

+0

你不能使用'json'作爲pdf的迴應。它應該是一個'HTML'響應,它也不適用於所有的瀏覽器。在給定的前。它返回'Url'意味着一個HTML響應。 –

回答

34

jQuery有一些問題,使用AJAX請求,因爲它還沒有實現一些HTML5 XHR V2功能加載的二進制數據,請參閱本enhancement requestdiscussion

鑑於這種情況,有兩種解決方法之一:

首先解決方案,放棄jQuery和使用XMLHttpRequest

圍棋與本地HTMLHTTPRequest,這裏是代碼做你需要

var req = new XMLHttpRequest(); 
    req.open("GET", "/file.pdf", true); 
    req.responseType = "blob"; 

    req.onload = function (event) { 
    var blob = req.response; 
    console.log(blob.size); 
    var link=document.createElement('a'); 
    link.href=window.URL.createObjectURL(blob); 
    link.download="Dossier_" + new Date() + ".pdf"; 
    link.click(); 
    }; 

    req.send(); 

二的解決方案,使用jQuery的AJAX本地插件

該插件可以發現here,可用於對XHR V2能力,JQuery的缺失,這裏是一個示例代碼如何使用它

$.ajax({ 
    dataType: 'native', 
    url: "/file.pdf", 
    xhrFields: { 
    responseType: 'blob' 
    }, 
    success: function(blob){ 
    console.log(blob.size); 
     var link=document.createElement('a'); 
     link.href=window.URL.createObjectURL(blob); 
     link.download="Dossier_" + new Date() + ".pdf"; 
     link.click(); 
    } 
}); 
+2

似乎在Firefox中不起作用 –

+4

要使它在Firefox中工作,您必須添加'document.body.appendChild(link);'在點擊鏈接之前:) –

3

我是新手,大多數的代碼是從谷歌搜索。我得到了我的pdf下載與下面的代碼(試錯遊戲)。感謝上面的代碼提示(xhrFields)。

$.ajax({ 
      cache: false, 
      type: 'POST', 
      url: 'yourURL' 
      contentType: false, 
      processData: false, 
      data: yourdata, 
      //xhrFields is what did the trick to read the blob to pdf 
      xhrFields: { 
       responseType: 'blob' 
      }, 
      success: function (response, status, xhr) { 

       var filename = "";     
       var disposition = xhr.getResponseHeader('Content-Disposition'); 

       if (disposition) { 
        var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/; 
        var matches = filenameRegex.exec(disposition); 
        if (matches !== null && matches[1]) filename = matches[1].replace(/['"]/g, ''); 
       } 
       var linkelem = document.createElement('a'); 
       try { 
              var blob = new Blob([response], { type: 'application/octet-stream' });       

        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; 
          } else { 
           a.href = downloadUrl; 
           a.download = filename; 
           document.body.appendChild(a); 
           a.target = "_blank"; 
           a.click(); 
          } 
         } else { 
          window.location = downloadUrl; 
         } 
        } 

       } catch (ex) { 
        console.log(ex); 
       } 
      } 
     });