从JavaScript中的字节下载文件

从JavaScript中的字节下载文件,javascript,post,request,response,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文件,但文件本身已损坏

我想从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文件,但文件本身已损坏


如何实现这一点?

Blob
构造函数中设置
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();

我很久以前问过这个问题,所以在一些细节上我可能是错的

原来
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;
 }
以下是如何同时使用这两个功能:

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

这有点像+1评论。我正试图做同样的事情,并以同样的结果-一个损坏的PDF。PDF将打开,具有与我预期相同的页数,但没有文本。我怀疑问题在于PDF的编码,或者将其从
[resultByes]
转换为blob。。。我想听听你是否想出了一个解决方案。@runlevelsix,是的,我找到了!请看下面我的答案,看看它是否适用于您。对于我,代码在
Firefox 58.0.2
中不起作用,它执行时没有错误,但下载对话框不会出现。我需要将链接附加到
body
,它就可以工作了。我正在从服务器端返回base64,使用您的方法时,它会给我一个错误:无法在“窗口”上执行“atob”:要解码的字符串编码不正确。为了避免“无法在“窗口”上执行“atob”错误,我必须将MVC操作中的数据作为JSON返回(与FileResult/FileContentResult相反)我也有同样的问题,在我的案例中,解决方案是确保以适当的
Base64
格式将数据从服务器端传输到客户端。一旦我这么做了,你的解决方案对我起了作用。非常感谢。对于那些在Firefox或IE中无法下载的问题。更改:link.click()到link.dispatchEvent(新建MouseeEvent(
单击
,{bubbles:true,cancelable:true,view:window}));
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();