2016-01-04 18 views
16

Ich möchte eine PDF-Datei für Jquery Ajax-Antwort herunterladen. Ajax-Antwort enthält PDF-Dateidaten. Ich habe das solution versucht. Mein Code ist unten angegeben, aber ich bekomme immer ein leeres PDF.Download pdf-Datei mit jquery ajax

$(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

Try Ersetzen 'XMLHttpRequest' für' jQuery.ajax() 'siehe http://stackoverflow.com/questions/12876000/how-to-build-pdf-file-from-binary-string-returned- from-a-web-service-using-javas – guest271314

+1

Warum brauchen Sie AJAX dafür? Das Herunterladen von Dateien ist viel einfacher und zuverlässiger ohne sie möglich. –

+0

Sie können kein PDF mit 'json' Antwort erstellen. Es sollte eine' HTML' Antwort sein und es funktioniert auch nicht in allen Browsern. In gegebenen ex. Es gibt zurück "URL" bedeutet eine HTML-Antwort. –

Antwort

34

jQuery einige Probleme Laden Binärdaten hat AJAX-Anforderungen verwenden, da es noch nicht irgend HTML5 XHR v2-Funktionen nicht implementiert, finden Sie in diesem enhancement request und dieses discussion

Da Sie eine von zwei Lösungen:

Erste Lösung, JQuery verlassen und XMLHTTPRequest

Gehen Sie mit dem nativen HTMLHTTPRequest verwenden, hier ist der Code zu tun, was Sie brauchen

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(); 

Zweite Lösung, verwenden Sie die Jquery-Ajax-native Plugin

Das Plugin here gefunden werden kann und auf die XHR V2-Funktionen verwendet werden, in JQuery fehlt, hier ist ein Beispielcode, wie um es zu nutzen

$.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

Scheint nicht in Firefox zu funktionieren –

+4

Um es in Firefox arbeiten zu lassen, müssen Sie 'document.body.appendChild (link);' bevor du auf den Link klickst :) –

3

ich bin Neuling und die meisten der Code von google-Suche. Ich habe meinen PDF-Download mit dem unten stehenden Code (Trial and Error Play) bearbeitet. Vielen Dank für die obigen Codehinweise (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); 
       } 
      } 
     });