大尺寸文件下载

Big size file download

提问人:mvb13 提问时间:4/27/2022 更新时间:4/28/2022 访问量:227

问:

在我的网页上,我有以下JS代码,可以在用户单击时从服务器下载文件:

var oReq = new XMLHttpRequest();
oReq.open("POST", otherUrl, true);
oReq.responseType = "arraybuffer";

oReq.onload = function(oEvent) {
    var blob = new Blob([oReq.response], 
                        {type: oReq.getResponseHeader('Content-Type')});
    var objectURL = URL.createObjectURL(blob);
    downloadLink.href = objectURL;
    downloadLink.click();
};
oReq.onprogress = function(oEvent) {
    var percentage = Math.round(oEvent.loaded/oEvent.total*100);
    
    downloadProgressDiv.innerHTML = "Progress: " + percentage + " % (" + oEvent.loaded 
                                    + " from " + oEvent.total + " )";
};
oReq.send(this.path);

它适用于小于 1GB 大小的文件。当我尝试下载的文件大小约为 3GB 时,我遇到的问题就会发生。在这种情况下,方法与其他文件一样工作,一旦下载完成,就会调用方法,但是.我也可以保存文件,但其大小为 1KB。onprogressonloadoReq.response=null

你能给我一些提示,为什么会这样吗?有什么其他方法可以做到这一点吗?

JavaScript 阿贾克斯 Google-Chrome

评论

0赞 CBroe 4/27/2022
可能是因为浏览器内存不足,当您要求它为如此大小的对象创建对象 URL 时......
1赞 CBroe 4/27/2022
“有什么其他方法吗?”- 抛弃 AJAX,并提交一个表单,以发送您需要的任何参数......?method="post"
0赞 mvb13 4/28/2022
很好的老式表单提交。这样做,它适用于 3GB 文件。将此添加到下面的答案中,我会投票。

答:

1赞 CBroe 4/28/2022 #1

任何提示为什么会发生这种情况?

可能是因为浏览器内存不足,当您要求它为这种大小的对象创建对象 URL 时。

有什么其他方法可以做到这一点吗?

不要使用 AJAX,而是提交一个表单,以发送您需要的任何参数。method="post"