通过大blob或文件从chrome扩展
Pass large blob or file from chrome extension
我试着写一个扩展缓存我的网站上使用的一些大型媒体文件,这样你就可以在安装扩展时本地缓存这些文件:
- 我通过chrome.runtime.sendMessage传递url到扩展(works)
- 在后台页面(works)通过XMLHttpRequest获取媒体文件
- 使用FileSystem API (works)存储文件
- 获取一个File对象并使用URL将其转换为URL。createObjectURL(作品)
- 返回URL到网页(错误)
遗憾的是,该URL不能在网页上使用。我得到以下错误:
不允许加载本地资源:blob:chrome-extension%3A//hlcoamoijhlmhjjxxxbl/e66a4ebc-1787-47e9-aaaa-f4236b710bda
从扩展名传递大文件对象到网页的最佳方法是什么?
你就快成功了。
在后台页面创建blob:
-URL并传递给内容脚本后,不要转发到网页。相反,使用XMLHttpRequest检索blob,创建一个新的blob:-URL, 然后将其发送到web页面。
// assuming that you've got a valid blob:chrome-extension-URL...
var blobchromeextensionurlhere = 'blob:chrome-extension....';
var x = new XMLHttpRequest();
x.open('GET', blobchromeextensionurlhere);
x.responseType = 'blob';
x.onload = function() {
var url = URL.createObjectURL(x.response);
// Example: blob:http%3A//example.com/17e9d36c-f5cd-48e6-b6b9-589890de1d23
// Now pass url to the page, e.g. using postMessage
};
x.send();
如果你目前的设置不使用内容脚本,但例如webRequest API重定向请求到缓存的结果,那么另一个选择是使用数据uri(一个文件或Blob可以使用<FileReader>.readAsDataURL
转换为数据uri)。不能使用XMLHttpRequest读取data - uri,但这在Chrome的未来版本中是可能的(http://crbug.com/308768)。
我能想到的两种可能性
1)使用externally_connectable
这个方法在这里的文档中有描述。
它的本质是:你可以声明这样那样的网页可以传递消息给你的扩展,然后chrome.runtime.connect
和chrome.runtime.sendMessage
就会暴露给这个网页。
你可以让网页打开一个端口到你的扩展,并使用它的数据。请注意,只有网页可以发起连接。
2)使用window.PostMessage
该方法在文档中提到(注意过时的提到window.webkitPostMessage
),并在这里详细描述。
你可以,据我所知,从该方法的文档(来自不同的地方),传递任何对象与它,包括blobs。
- chrome扩展中的navigator.geolocation.getCurrentPosition
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- chrome扩展更改主机/域警告
- 如何在chrome扩展中重定向到html页面
- Chrome扩展没有't在重新加载之前考虑期权价值
- 如何通过自己获得Chrome扩展的用户反馈/错误报告
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- 从选项页面更新chrome扩展清单权限
- 如何将chrome扩展功能移植到移动设备(特别是jquery和trello)
- Chrome扩展:遍历不同的页面并收集数据
- 未捕获的类型错误:无法读取属性'addEventListener'的null chrome扩展名
- 可以从Chrome扩展修改窗口对象吗
- 从popup.js|Chrome扩展访问DOM
- 从Chrome扩展名中的popup.html文件在background.js文件中运行一个函数
- 在Chrome扩展内部输出Google API调用
- 检查是否存在使用chrome扩展的javascript库
- 从Chrome扩展访问Google Cloud SQL数据库
- Chrome扩展,Chrome.tabs.query的结果未定义
- 为tweet构建chrome扩展
- 在chrome扩展中使用AJAX获取目录中的文件数