从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虽然包含一些数据但看起来是空的