gpt4 book ai didi

flash - 使用javascript处理大文件下载

转载 作者:行者123 更新时间:2023-12-05 07:22:23 25 4
gpt4 key购买 nike

我有一台托管非常大文件的服务器:> 50GB。到目前为止,这些文件只是通过浏览器正常下载。 ( <a href="..."> )
问题是,很多时候这些都是通过慢速/不可靠的连接下载的,如果下载失败,他们必须从头开始。
作为对此的解决方案,我想在浏览器中制作一个替代下载器,其中每个下载的 block 都使用 javascript 保存到一些临时存储中,允许在失败时恢复下载。

使用类似内容的一个很好的例子是 mega.nz .下载是用 javascript 处理的,当整个文件下载到一个临时位置时,浏览器会显示经典的文件下载对话框,它实际上是在引用一个 blob url。我想出了一些解决方案,但困难的部分是我需要支持 FF、Chrome 和 IE 11+。

解决方案 #1) 获取 + 文件系统 API + HTTP 范围 header
我用 fetch()并将结果流式传输到 FileWriter .如果下载失败,我可以检查文件中写入了多少字节,并使用 Range标题在下fetch() .下载完成后,我可以获得类似 filesystem:http://some-url/file 的网址,我可以将其指定为 a href 的属性标签,带有 download选项集。我发一个click()事件,文件几乎是瞬间下载。整个文件并没有加载到内存中,所以它可以处理非常大的文件,但这种方法只适用于 Chrome。我知道有一个使用 indexedDB 的 FileSystem API 的 polyfill,但是当我需要生成 url 时,它会给我一个 blob,它被加载到内存中。写入操作还将整个值加载到内存中,附加到内存中,然后再将其写回。 (效率不高,并且不适用于大文件)

解决方案 #2) Service workers + IndexedDB
使用 service worker,我可以劫持 fetch事件,并发回我想要的任何数据。我可以使用它来实现将文件保存到 IndexedDB,并从那里逐 block 提供它们,如果我制作 ReadableStream,则无需将整个内容加载到内存中。逻辑正确。

解决方案#3) Flash (Actionscript)
Mega 似乎使用一些基于 Flash 的下载器作为旧浏览器的后备,尚未研究过,但也许这是 IE 的可行解决方案。

解决方案 #4) ActiveX
再次是 IE 的可能解决方案。 ActiveX 能否用于将数据直接流式传输到文件系统而不将其加载到内存中?

到目前为止,我缺少对 IE 和未启用服务 worker 的 FF 版本(如 Firefox ESR)的支持。 IE 有 IndexedDB,但为了下载数据,我必须制作一个包含整个文件的 blob,并将其加载到内存中

还有什么我想念的吗?还有其他方法可以实现吗?注意:不幸的是,浏览器扩展是禁止使用的。

最佳答案

我建议使用 Background Fetch API ,但需要注意的是,目前它仅在 Chrome 74+(以及相应的 Edge 预览版)中受支持。它专为您的用例而设计。

我可以想象在支持时使用它,并在不支持它的浏览器上回退到替代方案。

关于flash - 使用javascript处理大文件下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56542567/

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