从JavaScript中的字节下载文件

我想从AJAX响应中下载以字节forms出现的文件。

我试图在Bolb的帮助下这样Bolb

 var blob=new Blob([resultByte], {type: "application/pdf"}); var link=document.createElement('a'); link.href=window.URL.createObjectURL(blob); link.download="myFileName.pdf"; link.click(); 

它实际上是下载pdf文件但文件本身已损坏。

我怎么能做到这一点?

我问了很长时间的问题,所以我可能在某些细节上错了。

事实certificate, Blob需要数组缓冲区。 这就是为什么base64字节需要首先转换为数组缓冲区的原因。

这是执行此操作的function:

 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; } 

这是我保存pdf文件的function:

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

以下是如何将这两个函数结合使用:

 var sampleArr = base64ToArrayBuffer(data); saveByteArray("Sample Report", sampleArr); 

你只需要添加一个额外的行,它应该工作。 您的响应是服务器应用程序的字节数组

 var bytes = new Uint8Array(resultByte); // pass your byte response to this constructor var blob=new Blob([bytes], {type: "application/pdf"});// change resultByte to bytes var link=document.createElement('a'); link.href=window.URL.createObjectURL(blob); link.download="myFileName.pdf"; link.click(); 

Blob构造函数而不是createObjectURL设置Blob type

 var blob = new Blob([resultByte], {type: "application/pdf"}); var link = document.createElement("a"); link.href = window.URL.createObjectURL(blob); link.download = "myFileName.pdf"; link.click(); 

我遇到了类似的问题,但就我而言,问题在于数据从服务器传递到客户端。 确保服务器以Base64编码发送数据至关重要,否则客户端无法将PDF字符串反序列化为二进制格式。

服务器端:

 // represent PDF as byteArray for further serialization byte[] byteArray = ((java.io.ByteArrayOutputStream) pdfStream).toByteArray(); // serialize PDF to Base64 byte[] encodedBytes = java.util.Base64.getEncoder().encode(byteArray); 

服务器端和客户端代码片段的完整解决方案:

  • 下载的PDF虽然包含一些数据但看起来是空的