背景故事
我编写了一个专门的图像内联脚本,用于GreaseMonkey和Google。它应该下载PNG文件并将它们存储在data:
urls中的图像src
属性中。这听起来可能很荒谬,但某个网站将Content-Disposition
设置为attachment
以获取图像,而且我不希望每次都会弹出“另存为”对话框。
实际问题
该脚本使用XMLHttpRequest
获取数据,将其编码为base64并将其存储在适当的位置。到目前为止很好。但是,只有当我通过Firebug和Chrome控制台运行它时,它才能工作,而当我使用它作为适当的用户脚本时,它就不能工作了。据我所知,这是因为Greasemonkey脚本不能直接使用XMLHttpRequest
对象,而应该依赖于对GM_xmlhttpRequest
的调用。但是,我不能这样将responseType
设置为"blob"
或"arraybuffer"
,而且binary
参数似乎只适用于通过POST请求发送数据。我只得到Unicode字符串。
以防万一,图像与链接到它们的页面来自同一个域。我相信它满足了同样的起源。
xmlhttpRequest这里是GM_xmlhttpRequest文档。
是否有一种方法从Greasemonkey用户脚本中获取arraybuffer
?
发布于 2012-05-28 17:38:14
如果是相同的域,那么您可以使用XMLHttpRequest
,没有问题.使用GM_xmlhttpRequest
的唯一原因是图像/文件是否跨域(它目前有一个功能受损的子集)。
对于同域,可以使用XHR2,如这个答案所示.
对于跨域,您必须使用GM_xmlhttpRequest
,重写mime类型,并使用自定义编码器算法。同样,所有这些都在同样的答案中显示。
然而,听起来你只是想让下载图片更容易吗?如果是这样的话,那么您最好只使用优秀的DownThemAll扩展。
发布于 2012-05-28 07:18:36
overrideMimeType字符串(兼容性: 0.6.8+)可选。使用请求指定的MIME类型(E.G. "text/html;charset=ISO-8859-1")。
您可以将其设置为plain/text; charset=x-user-defined
(类型不重要,但字符集重要),按位并通过响应字符串将值添加到类型化数组并获取缓冲区:
var text = xhr.responseText,
len = text.length,
arr = new Uint8Array(len),
i = 0;
for( i = 0; i < len; ++i ) {
arr[i] = text.charCodeAt(i) & 0xFF;
}
arr.buffer //The arraybuffer
注意:这是原始二进制响应,而不是base64。
https://stackoverflow.com/questions/10786710
复制相似问题