Javascript 在google chrome上下载大文件(最大15MB)时出现问题

Javascript 在google chrome上下载大文件(最大15MB)时出现问题,javascript,angularjs,google-chrome,ruby-on-rails-4,Javascript,Angularjs,Google Chrome,Ruby On Rails 4,我在Google Chrome中有一个下载问题。 我使用的是Ruby 2.2、Rails 4.2和AngularJS 1.2 我们这里没有数据库。我们通过API得到的一切。我们试图下载的文件大约是7MB。它给出了“失败:网络错误”。尽管它在Firefox上运行良好 从API中我们可以得到JSON格式的二进制数据。我们正在分析它。然后: send_data response_fields["attachment"], type: response_fields["mimeType"], dispo

我在Google Chrome中有一个下载问题。 我使用的是Ruby 2.2、Rails 4.2和AngularJS 1.2

我们这里没有数据库。我们通过API得到的一切。我们试图下载的文件大约是7MB。它给出了“失败:网络错误”。尽管它在Firefox上运行良好

从API中我们可以得到JSON格式的二进制数据。我们正在分析它。然后:

send_data response_fields["attachment"], type: response_fields["mimeType"], disposition: 'attachment', filename: params[:filename]
当我们使用AngularJS时,我们在AngularJS控制器中捕获该值,然后将其转换为:

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上给出更大尺寸的错误

有什么建议吗


谢谢。

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

此问题是由于chrome在锚(
)中设置了大小限制,然后从此Blob创建一个,并将此ObjectURL作为锚的下载属性传递

//编辑自https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob#Polyfill
函数dataURIToBlob(dataURI){
var binStr=atob(dataURI.split(',')[1]),
len=binStr.长度,
arr=新的UINT8阵列(len),
mimeString=dataURI.split(',')[0]。split(':')[1]。split(';')[0]
对于(变量i=0;i
开始加载此45Mb视频

斑点
dataURI
尝试使用blob而不是Base64我遇到了相同的错误:下载失败-网络错误很遗憾chrome将URI限制为2MB。对于大尺寸使用blob的好方法。FF和chrome Fiddle之间的区别是什么?似乎same@PranavSingh是的,他们是一样的(IIRC).只是FF在
download
属性和stacksnippets上做了一些奇怪的事情(在我的系统中,它没有显示下载弹出窗口,并且使用blob的名称保存,没有扩展名)但它实际上似乎是固定在FF上的52@PranavSingh,您的意思是,即使在JSFIDLE上,也不在您自己的页面上?这听起来像是开发版本中的一个bug。无论如何,不要更改返回的blobURI。只应使用
下载
属性来设置文件名。对于更大的浏览器支持,您可能需要使用FileSaver.js库。您可以只需为它提供生成的blob和文件名,它就可以解决不同实现中的许多怪癖。(也适用于我的54 nightly,我没有开发版本)@kaido我的意思是我有一个rest API(POST)它可以动态创建zip并将其流式传输到客户端。我如何在客户端/浏览器端使用它?我已经使用表单提交单击完成了此操作,但对于非常大的文件,它会在一段时间后使网络失败。此外,当服务器位于本地时,此操作可以正常工作,但在部署到google k8s时会出现网络失败错误。我对此感到困惑在过去的18-20天里。