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



背景故事

我编写了一个专门的图像内联脚本,旨在与GreaseMonkey和Google Chrome一起使用。 它应该下载PNG文件并将它们存储在图像src属性中的data: URL中。 这听起来可能很荒谬,但某个网站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

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

对于同一域,您可以使用 XHR2,如本答案所示。

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


但是,听起来您只是想更轻松地下载图像? 如果是这样,那么你最好只使用优秀的DownThemAll扩展。

覆盖Mime类型字符串(兼容性:0.6.8+)可选。MIME 类型 与请求一起指定(例如"文本/html;字符集=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。

相关内容

  • 没有找到相关文章