从JavaScript中的字节下载文件

时间:2016-01-27 13:37:51

标签: javascript post request response

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

我试图在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文件,但文件本身已损坏。

我该如何做到这一点?

3 个答案:

答案 0 :(得分:83)

我很久以前就问了这个问题,所以我在某些细节上可能会出错。

事实证明Blob需要数组缓冲区。这就是为什么需要先将base64字节转换为数组缓冲区。

这是执行此操作的功能:

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:0)

Blob构造函数而不是type

设置Blob createObjectURL
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();