3

背景故事

我编写了一个专门用于 GreaseMonkey 和 Google Chrome 的图像内嵌脚本。它应该下载PNG文件并将它们存储在图像属性的data:url中。src这听起来可能很荒谬,但某个网站设置Content-Dispositionattachment图像,我不希望每次都弹出“另存为”对话框。

实际问题

该脚本使用 获取数据XMLHttpRequest,将其编码为 base64 并将其存储在适当的位置。到目前为止,很好。但它仅在我通过 Firebug 和 Chrome 开发控制台运行它时才有效,而当我将它用作正确的用户脚本时则无效。据我了解,这是因为 Greasemonkey 脚本不能XMLHttpRequest直接使用对象,而应该依赖于调用GM_xmlhttpRequest。但是,我无法设置responseType"blob""arraybuffer"那样,并且该binary参数似乎仅适用于通过 POST 请求发送数据。我只得到 Unicode 字符串。

以防万一,图像是从与链接到它们的页面相同的域中提供的。我相信它满足“同源”的东西。

http://wiki.greasespot.net/GM_xmlhttpRequest这里是 GM_xmlhttpRequest 文档。

有没有办法arraybuffer从 Greasemonkey 用户脚本中获取一个?

4

2 回答 2

2

如果同域,则可以使用XMLHttpRequest,没有问题。使用的唯一原因GM_xmlhttpRequest(当前具有残缺的功能子集)是图像/文件是否是跨域的。

对于same-domain,您可以使用 XHR2 ,如this answer所示。

对于跨域,您必须:使用GM_xmlhttpRequest、覆盖 mime 类型并使用自定义编码器算法。同样,这一切都显示在同一个答案中。


但是,听起来您只是想让下载图像更容易?如果是这样,那么您最好使用出色的DownThemAll 扩展

于 2012-05-29T01:38:14.367 回答
0

overrideMimeType 字符串(兼容性:0.6.8+)可选。与请求一起指定的 MIME 类型(例如“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。

于 2012-05-28T15:18:36.900 回答