Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firefox Streams API,StreamSaver,用于将客户端磁盘上动态生成的数据流传输到客户端磁盘_Javascript_Stream - Fatal编程技术网

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更可取

    如果有人让它工作的话