从内容脚本传递文件对象到后台.js或传递 createObjectURL(并在刷新后保持活动状态)

Pass File object to background.js from content script or pass createObjectURL (and keep alive after refresh)

本文关键字:刷新 createObjectURL 活动状态 js 脚本 文件 对象 后台      更新时间:2023-09-26

我的目标是在后台任务中上传一个文件,其中包含来自内容脚本的文件。

我认为不可能将 File 对象直接从内容脚本传递到后台chrome.runtime.sendMessage因为 JSON 序列化数据。

可以使用 URL.createObjectURL 将字符串 url 传递给文件,这有效。但是 URL 与创建它的窗口中的文档相关联(当前选项卡内容脚本(。如果我刷新,导航离开,关闭选项卡,这些网址将被销毁。

使用 FileReader 读取整个文件并保留在内存中不是一种选择,因为它会使大文件的扩展名崩溃。

问题:

  1. URL.createObjectURL活着?
  2. 将文件对象传递到后台?
  3. 使用内容脚本中的文件在后台任务中上传文件?
  4. 将文件链接传递到弹出窗口并在那里提交表单,然后在后台运行?
您可以使用

SharedWorker在内容脚本和后台脚本之间创建通信通道,以允许您传输 DOM 对象,例如 File s。有关示例,请参阅 chrome.runtime 是否支持发布包含可转移对象的邮件中的代码?

快速测试表明,确实可以将File发送到后台,但也表明其内部状态已损坏:您可以使用FileReader读取文件的内容,但无法通过XMLHttpRequest上传文件。

不过,我找到了一个解决方法:假设您的File存储在 file 变量中,您可以使用 file.slice(0, file.size) 而不是 file 来获取仍然受文件支持即使在将其传递到后台后仍可在XMLHttpRequest中使用Blob