背景故事
我写了一个专门的图像内联脚本,旨在与GreaseMonkey和谷歌Chrome一起使用。它应该下载PNG文件并将其存储在图像data:
属性中的src
网址中。这可能听起来很荒谬,但某个网站会将Content-Disposition
设置为attachment
以获取图像,我不希望每次都弹出“另存为”对话框。
实际问题
脚本使用XMLHttpRequest
获取数据,将其编码为base64并将其存储在适当的位置。到目前为止,好。但它只有在我通过Firebug和Chrome开发控制台运行它时才有效,而当我将它用作适当的用户脚本时则不行。据我了解,这是因为Greasemonkey脚本不能直接使用XMLHttpRequest
个对象,而应该依赖于对GM_xmlhttpRequest
的调用。但是,我无法将responseType
设置为"blob"
或"arraybuffer"
,binary
参数似乎仅适用于通过POST请求发送数据。我只获得Unicode字符串。
以防万一,图像是从与链接到它们的页面相同的域提供的。我相信它满足了“同源”的东西。
http://wiki.greasespot.net/GM_xmlhttpRequest这里是GM_xmlhttpRequest文档。
有没有办法从Greasemonkey用户手中获取arraybuffer
?
答案 0 :(得分:2)
如果 是 同域,那么您可以使用XMLHttpRequest
,没有任何问题。使用GM_xmlhttpRequest
(目前有一个残缺的功能子集)的唯一原因是图像/文件是跨域的。
对于同域,您可以使用XHR2,如this answer所示。
对于跨域,您必须:使用GM_xmlhttpRequest
,覆盖mime类型,并使用自定义编码器算法。同样,这一切都显示在that same answer。
然而,听起来你只是想让下载图片更容易?如果是这样,那么你可能最好只使用优秀的DownThemAll extension。
答案 1 :(得分:0)
overrideMimeType字符串(兼容性:0.6.8+)可选。 MIME类型 用请求指定(E.G.“text / html; charset = ISO-8859-1”)。
您可以将此设置为plain/text; charset=x-user-defined
(类型无关紧要,但字符集确实如此),按位AND通过响应字符串并将值添加到类型化数组并获取缓冲区:
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。