- javascript/
- Javascript Firefox Streams API,StreamSaver,用于将客户端磁盘上动态生成的数据流传输到客户端磁盘
Javascript Firefox Streams API,StreamSaver,用于将客户端磁盘上动态生成的数据流传输到客户端磁盘
Javascript Firefox Streams API,StreamSaver,用于将客户端磁盘上动态生成的数据流传输到客户端磁盘,javascript,stream,Javascript,Stream,这个问题的背景是,将数据从indexedDB写入客户机磁盘,然后重新读取,所有操作都在客户机上执行
到目前为止,为了将数据库写入磁盘,我在indexedDB数据库中,在对象存储索引上的打开游标上使用了以下步骤:
从数据库中提取数据对象
使用JSON.stringify将对象转换为字符串
创建JSON字符串的新blob{type:'text/csv'}
将blob写入数组
将光标向下移动一次,并从步骤1开始重复
事务成功完成后,从blob阵列中创建一个相同类型的新blob,并在客户端许可下下载到磁
这个问题的背景是,将数据从indexedDB写入客户机磁盘,然后重新读取,所有操作都在客户机上执行
到目前为止,为了将数据库写入磁盘,我在indexedDB数据库中,在对象存储索引上的打开游标上使用了以下步骤:
从数据库中提取数据对象
使用JSON.stringify将对象转换为字符串
创建JSON字符串的新blob{type:'text/csv'}
将blob写入数组
将光标向下移动一次,并从步骤1开始重复
事务成功完成后,从blob阵列中创建一个相同类型的新blob,并在客户端许可下下载到磁盘李>
当然,当blob较大时,这可能会暂时占用大量RAM
从客户机磁盘读入是通过在读取、解析和写入数据库之前将blob/文本文件分割成更小的段来完成的。这种方法在切片之前引入大blob时似乎无法保持RAM,就像从磁盘读取切片一样。我并不是说情况就是这样,只是我并没有像生成要下载到磁盘的文本块时那样,在读入和写入数据库的过程中观察到内存使用量的大幅增加。进一步描述
作为一名新手,我开始怀疑上面步骤3中的组件blob是否可以按照生成的顺序写入客户机磁盘,而不是写入阵列并在下载之前将整个blob保存在RAM中。根据这一点,web扩展不再具有完成此任务所需的特权javascript代码
这似乎在某种程度上解决了这一问题,但我不知道FileSaver和StreamSaver到底是什么,也不知道尝试在应用程序中包含这两个文件的后果(如果可能的话),或者如何包含
此外,MDNWebDocs在StreamsAPI中描述了一个新的可写流,这让我想知道,如果没有这两个,现在是否可以实现这一点
我的目标是使用在客户端脱机运行的javascript将数据流传输到客户端磁盘,以避免在单个文件相当大的过程中消耗RAM
请解释什么是FileSaver和StreamSaver(不是它们的功能),它们是否可以包含在脱机应用程序中,如果可以,其含义是什么?
另外,是否可以在不使用这些项目的情况下使用Streams API中现有的内容来编写此代码?我了解到,如果可能,还需要一名服务人员,但我认为这不能在脱机应用程序或本地html文件中完成
多谢各位
更新
streams API似乎太新,无法使用。我试图采用我的另一个问题的评论中给出的建议,即如果可以拦截web请求或下载,使用webRequest流过滤器可能会起作用,如果需要修改其响应头以启动下载,然后使用流过滤器向其写入
我试了几天(先学了很多基础知识),虽然这似乎是个好主意,但得出的结论是,由于这些原因,目前不可能做到这一点,我在重复这个问题
一个是webRequest根本不拦截downloads.download()函数或任何下载事件;因此,您无法截获下载,甚至需要一个内容处置为“附件”的事件来尝试使用流对其进行写入。我可以拦截对锚定标记href的强制单击,但除了onBeforeRequest之外没有其他事件触发
另一个是在onHeadersReceived事件之前不能修改响应头,这意味着假URL必须返回某些内容。你不能在onBeforeRequest中取消它。所以,这在离线情况下是行不通的。但是,即使您让它在线处理返回响应头的现有URL,它也不会接受修改。我反复尝试修改响应标题,但它就是不起作用。我尝试了XMLHttpRequest GET,可以截获触发的事件,但无法修改响应头;因此,无法将内容配置设置为“附件”(带或不带文件)以开始下载。我可以给它写信,但如果它不下载我写的东西,那就没用了。如果将书面内容放到网页上就可以了
此外,如果您将URL重定向到除webRequest可接受URL以外的任何其他URL,则其他事件将不可拦截。因此,如果重定向到onBeforeRequest中的对象URL或扩展URL,则不会在webRequest中拦截响应头阶段,但可以在XMLHttpRequest的onreadystatechange事件中查看它们
因此,结果是,即使MDNWeb文档说这是可能的,响应头似乎也无法修改。而且,这种使用webRequest流过滤器对客户端上生成的或从indexedDB数据库提取的数据流进行过滤的想法,与构建一个大型blob进行下载的想法相反,不会起作用,因为无法截获下载或更改响应头以触发下载,并通过流过滤器写入
这是一个有趣的想法。我仍然想知道,当数据被写入客户端并以块或块的形式传递时,下载是否会保持“开放”。也许,如果响应头中说明如何传递和接收数据的部分也被修改,那么它也会工作
现在,我不再追求这种方法。其中一个Web文档或错误记录表明,计划允许拦截数据URL。也许,对于客户端的离线下载,这比伪造URL更可取
如果有人让它工作的话