我在谷歌浏览器下载时遇到了问题。我使用的是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中较大的文件大小会出现错误。
有什么建议吗?
谢谢。
2条答案
按热度按时间mu0hgdu01#
这几乎是1和2这两个问题的翻版,但由于它们确实专门处理canvas元素,因此我将在这里重写一个更全局化的解决方案。
这个问题是由于chrome在anchor(
<a>
)download
属性中设置了一个大小限制,我不太清楚他们为什么这么做,但是解决方法很简单。将dataURI转换为Blob,然后从此Blob创建ObjectURL,并将此ObjectURL作为锚的download属性传递。
和一个jsfiddle version的FF,因为他们不允许
download
属性从堆栈片段...vsaztqbk2#
这个答案更具体地回答了这个问题:[对于大文件,使用dataURI创建iframe失败,是否有解决方法?](Creating iframe with dataURI fails for large files, any workaround?)
但是,该问题被标记为与此问题重复(实际上不是重复),之前的答案没有直接解决此问题。如果有此问题的好答案,将对我有所帮助。我能够提出此问题的解决方案,并将其复制如下。
下面是一个示例函数,它将接受dataURI,将其转换为blob并在iframe中打开它。