从JavaScript中的字节下载文件

Jah*_*nov 41 javascript post response request

我想从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();
Run Code Online (Sandbox Code Playgroud)

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

我怎么能做到这一点?

Jah*_*nov 99

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

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;
 }
Run Code Online (Sandbox Code Playgroud)

这是我保存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();
};
Run Code Online (Sandbox Code Playgroud)

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

var sampleArr = base64ToArrayBuffer(data);
saveByteArray("Sample Report", sampleArr);
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,该代码在Firefox 58.0.2中不起作用,它没有错误执行,但没有出现下载对话框。我需要将链接附加到`body`上,并且它可以工作。https://bugzilla.mozilla.org/show_bug.cgi?id=1091035 (3认同)
  • 首先,谢谢你,这太棒了,我到处寻找.二,timeNow和month变量是什么? (2认同)
  • 我从服务器端返回 base64,在使用您的方法时,它给了我一个错误:无法在“窗口”上执行“atob”:要解码的字符串未正确编码。 (2认同)

Kri*_*ngh 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();
Run Code Online (Sandbox Code Playgroud)