我的Firefox扩展插件如何下载部分下载的文件

How can my Firefox extension download a partially downloaded file?

本文关键字:下载 文件 扩展 Firefox 插件 何下载 我的      更新时间:2023-09-26

Mozilla有一些代码片段,用于从Firefox扩展下载文件。

我没有看到如何完成类似于wget -c的部分下载文件的下载。

有没有办法继续从Firefox扩展程序下载部分下载的文件?

nsIWebBrowserPersist.saveURI()的文档有一个参数aExtraHeaders。我只是在那里使用HTTP头Range吗?

nsIWebBrowserPersist API不支持恢复。

您可以尝试使用内置的下载管理器。或者至少它的代码可能会有所帮助。

否则,你就必须更低级。在总体方案中,您需要:

  • 直接使用nsIChannel/nsIHttpChannel
  • 通过nsIIOService.newChannel*()构建一个通道
  • 尝试将信道QueryInterface连接到nsIHttpChannel
  • 再次使用nsIHttpChannel.setRequestHeaderQI并使用nsIResumableChannel.resumeAt()。后者要求您事先知道entityID(http的ETag),但在使用时会处理一些事情,比如验证服务器是否确实使用了范围响应
  • 实现一个nsIStreamLister/nsIRequestObserver,并用它调用channel.asyncOpen(listener, ...)
  • listener.onStartRequest中,您需要仔细检查请求是否可以继续(服务器实际回复了206,依此类推)。此外,打开文件的时间,可以通过nsIFileStream或类似OS.file的东西(出于快速的原因,现在更喜欢后者)。有关详细信息,请参阅MDN。不要忘记在文件中查找适当的位置
  • listener.onDataAvailable中,将数据写入文件。还要检查服务器是否没有发送过多数据
  • listener.onStopRequest中,处理任何故障(断开连接、转移金额)。关闭文件。通知用户或其他什么
  • 您可能需要实现许多其他东西,例如处理重定向、http验证等

正如您所看到的,您需要做的工作量和需要编写的代码量是非常重要的。