簡體   English   中英

從ajax響應下載pdf文件

[英]Download pdf file from ajax response

我試圖讓瀏覽器下載從 ajax 響應中收到的 pdf 文件。

使用 jquery ajax 下載 pdf 文件的啟發,我模擬了這樣的點擊/下載事件:

    var req = new XMLHttpRequest();
    req.open("POST", "/servicepath/Method?ids=" + ids, true);
    req.responseType = "blob";
    req.onreadystatechange = function () {
        if (req.readyState === 4 && req.status === 200) {
            var blob = req.response;
            var link = document.createElement('a');
            link.href = window.URL.createObjectURL(blob);
            link.download = "PdfName-" + new Date().getTime() + ".pdf";
            link.click();
        }
    };
    req.send();

不幸的是,這只適用於 Chrome,但不適用於 Firefox + IE。 當我嘗試在最后兩個瀏覽器中觸發它時沒有任何反應。

由於從 CMS 繼承,腳本和標記放置在 iframe 中,但我不確定這是否有任何影響。

關於如何為所有現代瀏覽器優化它的任何想法?

此版本適用於所有現代瀏覽器:

var req = new XMLHttpRequest();
req.open("POST", "/servicepath/Method?ids=" + ids, true);
req.responseType = "blob";
req.onreadystatechange = function () {
    if (req.readyState === 4 && req.status === 200) {
        var filename = "PdfName-" + new Date().getTime() + ".pdf";
        if (typeof window.chrome !== 'undefined') {
            // Chrome version
            var link = document.createElement('a');
            link.href = window.URL.createObjectURL(req.response);
            link.download = "PdfName-" + new Date().getTime() + ".pdf";
            link.click();
        } else if (typeof window.navigator.msSaveBlob !== 'undefined') {
            // IE version
            var blob = new Blob([req.response], { type: 'application/pdf' });
            window.navigator.msSaveBlob(blob, filename);
        } else {
            // Firefox version
            var file = new File([req.response], filename, { type: 'application/force-download' });
            window.open(URL.createObjectURL(file));
        }
    }
};
req.send();

我還試圖獲得一個 safari 版本,但效果不佳。 將嘗試繼續調查它並為此提供解決方案。

關於如何為所有現代瀏覽器優化它的任何想法?

是的,我可以為您提供一個在 Windows 10 上使用 IE11、Firefox 47 和 Chrome 52 進行測試的解決方案。目前沒有針對 Microsoft Edge 的解決方案。

一開始需要區分是IE瀏覽器還是其他兩種瀏覽器。 這是因為在 IE11 上您可以使用:

window.navigator.msSaveBlob(req.response, "PdfName-" + new Date().getTime() + ".pdf");

對於其他兩個瀏覽器,您的代碼適用於 Chrome,但不適用於 Firefox,因為您沒有將元素附加到文檔正文。

所以更正后的代碼是:

var req = new XMLHttpRequest();
req.open("POST", "/servicepath/Method?ids=" + ids, true);
req.responseType = "blob";
req.onreadystatechange = function () {
  if (req.readyState === 4 && req.status === 200) {

    // test for IE

    if (typeof window.navigator.msSaveBlob === 'function') {
      window.navigator.msSaveBlob(req.response, "PdfName-" + new Date().getTime() + ".pdf");
    } else {
      var blob = req.response;
      var link = document.createElement('a');
      link.href = window.URL.createObjectURL(blob);
      link.download = "PdfName-" + new Date().getTime() + ".pdf";

      // append the link to the document body

      document.body.appendChild(link);

      link.click();
    }
  }
};
req.send();

下載文件的非常簡單的方法...

 $.ajax({
        url:"{{url('.......')}}/"+customerOrderId,
        type:'post',
        data:{"_token":"{{csrf_token()}}"},
        success:function(e){
            console.log(e.file);
            var link = document.createElement('a');
            link.href = e.file;
            link.download = "invoice_"+customerOrderId+"_" + new Date() + ".pdf";
            link.click();
            link.remove()

        },
        error:function(e){
            alert('Something went wrong!');
        }
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM