在 JavaScript 中从字节下载文件

IT技术 javascript post request response
2021-01-29 19:04:38

我想从 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个回答

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

事实证明,这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);
对于那些无法在 Firefox 或 IE 中进行下载的问题。更改:link.click() 到 link.dispatchEvent(new MouseEvent( click, {bubbles: true, cancelable: true, view: window}));
2021-03-13 19:04:38
为了避免“无法在 'window' 上执行 'atob'”错误,我必须将 MVC 操作中的数据作为 JSON 返回(而不是 FileResult / FileContentResult)
2021-03-14 19:04:38
对我来说,代码在 中不起作用Firefox 58.0.2,它执行没有错误,但没有出现下载对话框。我需要将链接附加到body并且它可以工作。 bugzilla.mozilla.org/show_bug.cgi?id=1091035
2021-03-21 19:04:38
我正在从服务器端返回 base64,在使用您的方法时,它给了我一个错误:无法在 'Window' 上执行 'atob':要解码的字符串未正确编码。
2021-03-27 19:04:38
我遇到了同样的问题,在我的情况下,解决方案是确保我以正确的Base64格式将数据从服务器端传输到客户端一旦我做到了,你的解决方案对我有用。非常感谢。
2021-04-06 19:04:38

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

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 typeBlob构造函数而不是 atcreateObjectURL

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