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

2024-01-10

我在 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 控制器中捕获该值,然后将其转换为:

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

有什么建议么?

Thanks.


这几乎是这些问题的重复1 https://stackoverflow.com/questions/36918075/is-it-possible-to-programmatically-detect-size-limit-for-data-url and 2 https://stackoverflow.com/questions/36918075/is-it-possible-to-programmatically-detect-size-limit-for-data-url,但由于它们确实特别处理画布元素,因此我将在这里重写一个更全局的解决方案。

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

将您的 dataURI 转换为Blob https://developer.mozilla.org/en/docs/Web/API/Blob,然后创建一个对象URL https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL来自此 Blob,并将此 ObjectURL 作为锚点的下载属性传递。

// 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>

And a jsfiddle版本 https://jsfiddle.net/afzbe5zu/对于 FF,因为他们不允许download来自堆栈片段的属性...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 google chrome 上下载大文件(最大 15 mb)时出现问题 的相关文章

随机推荐

  • 无法在初始渲染中找到参考

    我刚刚在官方文档中读到 第一次渲染时没有调用 componentDidUpdate 我想这可能就是为什么我的这个组件第一次渲染时 dom 没有被定义 这是一个弹出模式 当需要编辑页面时会弹出 我还有其他方法可以解决这个问题吗 compone
  • 将文件移动到新目录的批处理命令

    我想编写一个批处理作业 执行时将抓取所有文件C Test Log文件夹并将它们移至新目录C Test 这个新目录的名称为 Backup 名称为 当前日期 因此 完成后 日志文件夹应该为空 所有文件现在都位于新文件夹中 我知道我必须使用MOV
  • Java:如何获取当前音频输入的频率?

    我想分析麦克风输入的当前频率 以使 LED 与播放的音乐同步 我知道如何从麦克风捕获声音 但我不知道 FFT 这是我在寻找获取频率的解决方案时经常看到的 我想测试一下某个频率的当前音量是否大于设定值 代码应该看起来像这样 if freque
  • 自动扩展 YAML 合并的工具?

    我正在寻找一种工具或流程 可以轻松获取包含锚点 别名和合并键的 YAML 文件 并扩展别名并合并到平面 YAML 文件中 仍有许多常用的 YAML 解析不完全支持合并 我希望能够利用合并来保持干燥 但在某些情况下 需要将其构建到更详细的 平
  • 破损的日食可以修复吗?

    几天后 我不能再使用 Ctrl S 等键盘快捷键 因为它会在我的源代码中插入特殊字符 在属性文件中 我注意到 Ctrl S 插入了 u2308 有没有办法修复此问题 而无需重新安装 STS 2 8 1 您可以尝试使用以下命令从命令行启动 E
  • 如何使用授权和客户端 ID 在 C# 中调用 Azure Maps API?

    我正在尝试使用Azure 地图 API使用坐标搜索某个点周围的 POI 但我不知道如何通过添加以下内容来调用 API授权 and 客户端 ID 这是我在 Microsoft 文档网站上尝试该 API 时收到的请求预览 GET https a
  • 续集“findbyid”不是一个函数,但显然“findAll”是

    我遇到了一个非常奇怪的问题 当我尝试调用函数 findAll 时 它工作正常 创建和销毁相同 但是当我尝试调用函数 findById 时 它会抛出 findById 不是函数 与 FindOne 相同 works fine var gamm
  • model.save_weights 是否包含优化器状态?

    如果是 那么他们是如何做到的 我的意思是 假设我有一个通过子类化定制的模型 我的优化器是一个单独的对象 一个命令如何保存两个不同物体的权重 特别是 它如何知道这两个对象是相关的 是由于 model compile 完成的魔法吗 编辑 我刚刚
  • Laravel 图像提交按钮

    我想知道是否有一种方法可以自定义提交按钮的外观 改为图像 拉拉维尔 3 http three laravel com docs 目前 我的提交按钮代码如下所示 Form open project delete DELETE Form hid
  • 在逻辑或可视树中查找工具提示弹出窗口

    说我有一个ToolTip使用 XAML 中指定的样式 如下所示
  • 使用 as.numeric(levels(f))[f] 将数据框中的因子子集转换为数字

    我有一个包含 100 个变量的数据框 我想要将其中的一个子集 例如 dataframename 30 50 转换为它们的原始数值 1 2 3 4 5 我知道我应该使用as numeric levels f f 当我转换一个因子时 但只有当我
  • 如何将一个目录中的所有文件重定向到另一个目录?

    我已将服务器上的文件移至新目录 并希望将所有请求 301 重定向到新目录中的文件 假设我有 域名 com test apples php 域名 com test oranges php 域名 com test bananas php 我如何
  • JavaScript setTimeout 如此不准确的原因是什么?

    我在这里得到了这段代码 var date new Date setTimeout function e var currentDate new Date if currentDate date gt 1000 console log cur
  • C 文件编程 - 使用 POSIX 调用替换文件中的文本

    有没有办法使用 POSIX 调用替换文本文件中的任何关键字 而无需重新创建文件 如果是的话请告诉我该怎么做 提前致谢 如果文本和替换的大小相同 则可以使用模式打开它r 查找 然后写入 如果它们的大小不同 则无法在不重新创建的情况下进行替换
  • 是否可以等待 Device.BeginInvokeOnMainThread 代码完成(继续使用 UI 调用的结果进行后台工作)

    在我的代码中 我有一个名为 ShowMessageBoxAsync 的任务 我想使用此代码向用户显示 并等待 DisplayAlert 并返回结果 像这样 var messageBoxResult wait View ShowMessage
  • System.IO.StreamReader 与 Get-Content 与 System.IO.File

    我一直在比较在Powershell中快速读取相对较大的文本文档的各种方法 这些文件的大小范围为 50kb 200mb 我需要快速解析它们以获取特定的行和 或特定的字符串 读取文件的三个常用工具 我知道 并且没有构建我自己的 C 库 是 Sy
  • 获取ggplot2图例以在r中显示百分号

    下面是我试图解决的问题的可重现示例 我在 ggplot2 中创建了一个热图 一切进展顺利 由于我已经在数据上放置了百分号以与 geom text 一起使用 所以我想让 geom tile 的图例也显示百分号 我现在只能将实际值乘以 100
  • 基于keras2.0的多输入多输出模型

    我在网上找了好久 但我什么也没发现 请帮助我或尝试给我一些关于如何实现这一目标的想法 我已经构建了 3 个输入和 2 个输出模型 如下所示 the code block is from def build srgan model in cl
  • 是否有 TFS 扩展 SDK API 或 REST API 调用可以从 TFS 2017 获取所有用户?

    我有一个 TFS 扩展 需要获取 TFS 2017 中所有用户的列表 是否有为此的 API 调用 我能找到的最接近的东西是CoreHttpClient getTeamMembers https www visualstudio com en
  • 在 google chrome 上下载大文件(最大 15 mb)时出现问题

    我在 Google Chrome 中遇到下载问题 我正在使用 Ruby 2 2 Rails 4 2 AngularJS 1 2 我们这里没有数据库 我们通过 API 获得的一切 我们尝试下载的文件大约 7 MB 它给我们 失败 网络错误 虽