如何从GreaseMonkey用户脚本中请求二进制文件?

时间:2012-05-28 15:01:44

标签: javascript ajax google-chrome greasemonkey binary-data

背景故事

我写了一个专门的图像内联脚本,旨在与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

2 个答案:

答案 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。