gpt4 book ai didi

javascript - 在 google chrome 上下载大文件(最大 15 mb)时出现问题

转载 作者:可可西里 更新时间:2023-11-01 02:20:52 25 4
gpt4 key购买 nike

我在 Google Chrome 中遇到下载问题。我正在使用 Ruby 2.2、Rails 4.2、AngularJS 1.2。

我们这里没有数据库。我们通过 API 获得的一切。我们尝试下载的文件大约为 7 MB。它给我们“失败:网络错误”。虽然它在 Firefox 上运行良好。

我们从 API 获取 JSON 格式的二进制数据。我们正在解析它。然后:

send_data response_fields["attachment"], type: response_fields["mimeType"], disposition: 'attachment', filename: params[:filename]

当我们使用 AngularJS 时,我们在 AngularJS Controller 中捕获该值,然后将其转换为:

var str = data;
var uri = "data:" + mimeType + ";base64," + str;

var downloadLink = document.createElement("a");
downloadLink.href = uri;
downloadLink.download = filename;
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);

这适用于 Firefox & 甚至 Chrome 更小的文件大小。不确定为什么它在 Chrome 上给出更大尺寸的错误。

有什么建议吗?

谢谢。

最佳答案

这几乎是这些问题的重复 12 ,但由于它们确实专门处理 canvas 元素,因此我将在此处重写一个更全局的解决方案。

此问题是由于 chrome 在 anchor 中设置了大小限制 ( <a> ) download属性。我不太确定他们为什么这样做,但解决方案非常简单。

将您的 dataURI 转换为 Blob , 然后创建一个 ObjectURL从这个 Blob,并将这个 ObjectURL 作为 anchor 的下载属性传递。

// edited from https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob#Polyfill
function dataURIToBlob(dataURI) {

var binStr = atob(dataURI.split(',')[1]),
len = binStr.length,
arr = new Uint8Array(len),
mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]

for (var i = 0; i < len; i++) {
arr[i] = binStr.charCodeAt(i);
}

return new Blob([arr], {
type: mimeString
});

}

var dataURI_DL = function() {

var dataURI = this.result;
var blob = dataURIToBlob(dataURI);
var url = URL.createObjectURL(blob);
var blobAnchor = document.getElementById('blob');
var dataURIAnchor = document.getElementById('dataURI');
blobAnchor.download = dataURIAnchor.download = 'yourFile.mp4';
blobAnchor.href = url;
dataURIAnchor.href = dataURI;
stat_.textContent = '';

blobAnchor.onclick = function() {
requestAnimationFrame(function() {
URL.revokeObjectURL(url);
})
};
};

// That may seem stupid, but for the sake of the example, we'll first convert a blob to a dataURI...
var start = function() {

stat_.textContent = 'Please wait while loading...';
var xhr = new XMLHttpRequest();
xhr.responseType = 'blob';
xhr.onload = function() {
status.textContent = 'converting';
var fr = new FileReader();
fr.onload = dataURI_DL;
fr.readAsDataURL(this.response);
};
xhr.open('GET', 'https://dl.dropboxusercontent.com/s/bch2j17v6ny4ako/movie720p.mp4?dl=0');
xhr.send();

confirm_btn.parentNode.removeChild(confirm_btn);
};

confirm_btn.onclick = start;
<button id="confirm_btn">Start the loading of this 45Mb video</button>
<span id="stat_"></span>
<br>
<a id="blob">blob</a>
<a id="dataURI">dataURI</a>

还有一个 jsfiddle version对于 FF,因为他们不允许 download来自堆栈片段的属性...

关于javascript - 在 google chrome 上下载大文件(最大 15 mb)时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38781968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com