2017-02-17 98 views
0

我从web api返回HttpResponseMessage,并在ajax调用中使用它,但变得空白pdf。从ajax调用中获取空白pdf在Web应用程序中返回HttpResponseMessage

我的Ajax调用

function downloadPDF() 
    { 
     $.ajax({ 
      type: "POST", 
      crossDomain: true, 
      data: JSON.stringify(UserData), 
      url: rootUrl + "api/WebAPI/Export", 
      //dataType: "native", 
      contentType: "application/json", 
      //responseType: 'arraybuffer', 
      //contentType: "application/pdf", 

      headers: headers, 
      success: function (data) { 
       //document.write(data); 
       alert(data.size); 
       var blob = new Blob([data]); 
       var link = document.createElement('a'); 
       link.href = window.URL.createObjectURL(blob); 
       link.download = "Dossier_" + new Date() + ".pdf"; 
       link.click(); 
      } 
    } 
+0

我想设置'Response.Content'为您的PDF流和'Response.Content.Headers.ContentType =新MediaTypeHeaderValue( “应用程序/ PDF格式”);'在web API应该自动下载的PDF作为这个ajax调用成功的一部分。 – Developer

+0

它已经在那里。 res.Content.Headers.ContentType = new MediaTypeHeaderValue(“application/pdf”); –

+0

你是否将pdf流设置为'res.Content'? – Developer

回答

1

将您HttpResponseMessage使用此功能(这应该是Base64String)到数组缓冲区:

function base64ToArrayBuffer(base64) { 
    var binaryString = window.atob(base64); 
    var binaryLen = binaryString.length; 
    var bytes = new Uint8Array(binaryLen); 
    for (var i = 0; i < binaryLen; i++) { 
     var ascii = binaryString.charCodeAt(i); 
     bytes[i] = ascii; 
    } 
    return bytes; 
} 

然后转换为数组后调用这个函数缓冲区:

function saveByteArray(pdfName, byte) { 
    var blob = new Blob([byte], { type: "application/pdf" }); 
    var link = document.createElement('a'); 
    link.href = window.URL.createObjectURL(blob); 
    var fileName = pdfName + ".pdf"; 
    link.download = fileName; 
    link.click(); 
}; 

因此,您的整个ajax调用将如下所示:

function downloadPDF() 
     { 
      $.ajax({ 
       type: "POST", 
       crossDomain: true, 
       data: JSON.stringify(UserData), 
       url: rootUrl + "api/WebAPI/Export", 
       //dataType: "native", 
       contentType: "application/json", 
       //responseType: 'arraybuffer', 
       //contentType: "application/pdf", 

       headers: headers, 
       success: function (data) { 
        //document.write(data); 
        alert(data.size); 
       var bytes = base64ToArrayBuffer(data); 
       saveByteArray("Dossier_" + new Date(), bytes); 

       } 
     }