在用户脚本中使用 XMLHttpRequest 下载图像
首先,这里有一个问题,其标题相同,但它不是我要找的,而且它不也没有完整的答案。
这是我的问题。假设我有一个指向图像的 URL。
https://fbcdn-photos-a.akamaihd.net/hphotos-ak-ash4/299595_10150290138650735_543370734_8021370_355110168_n.jpg
一旦我将此参数 ?dl=1
放在 URL 末尾,它就可以下载。
https://fbcdn-photos-a.akamaihd.net/hphotos-ak-ash4/299595_10150290138650735_543370734_8021370_355110168_n.jpg?dl=1
我正在尝试通过用户脚本来完成此任务。所以我为此使用了 XMLHttpRequest。
var url = "https://fbcdn-photos-a.akamaihd.net/hphotos-ak-ash4/299595_10150290138650735_543370734_8021370_355110168_n.jpg?dl=1";
var request = new XMLHttpRequest();
request.open("GET", url, false);
request.send(null);
if (request.status === 200)
{
alert(request.statusText);
}
这是一个小提琴。
但这不起作用。
First of all there is a question with the same title here on SO but its not what I'm looking for and it doesn't have a complete answer either.
So here's my question. Say I have this URL which directs to an image.
https://fbcdn-photos-a.akamaihd.net/hphotos-ak-ash4/299595_10150290138650735_543370734_8021370_355110168_n.jpg
Once I put this parameter ?dl=1
to the end of the URL, it becomes downloadable.
https://fbcdn-photos-a.akamaihd.net/hphotos-ak-ash4/299595_10150290138650735_543370734_8021370_355110168_n.jpg?dl=1
I'm trying to do this task through a userscript. So I used XMLHttpRequest for that.
var url = "https://fbcdn-photos-a.akamaihd.net/hphotos-ak-ash4/299595_10150290138650735_543370734_8021370_355110168_n.jpg?dl=1";
var request = new XMLHttpRequest();
request.open("GET", url, false);
request.send(null);
if (request.status === 200)
{
alert(request.statusText);
}
Here is a fiddle.
But it does not work.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
XMLHttpRequest
无法跨域工作,但由于这是一个用户脚本,Chrome 现在仅支持用户脚本中的GM_xmlhttpRequest()
。像这样的东西应该可以工作,请注意它是异步的:
至于获取和使用实际图像数据,这是一个需要解决的主要难题。
您可以在 Firefox 中使用新的
.responseType = "blob";
功能,但 Chrome 尚不支持。在 Chrome 或 Firefox 中,仅针对同一域,您可以使用新的 XHR2 像这样:
在 jsBin 上查看实际效果。
GM_xmlhttpRequest()
确实如此(尚)不支持设置responseType
。因此,对于 GM 脚本或用户脚本应用程序,我们必须使用自定义的 base64 编码方案,如 “Javascript Hacks:使用 XHR 加载二进制数据”。
脚本代码变成这样:
XMLHttpRequest
will not work cross-domain, but since this is a userscript Chrome now supportsGM_xmlhttpRequest()
in userscripts only.Something like this should work, note that it is asynchronous:
As for getting and using the actual image data, that is a major pain to work out.
You can use the new
.responseType = "blob";
functionality in Firefox but Chrome does not yet support it.In Chrome or Firefox, for the same domain only, you can use the new XHR2 like so:
See it in action at jsBin.
GM_xmlhttpRequest()
does not (yet) support settingresponseType
.So, for GM script or userscript applications, we have to use a custom base64 encoding scheme like in "Javascript Hacks: Using XHR to load binary data".
The script code becomes something like:
现代浏览器有 Blob 对象:
headers< /code> param 将设置引荐来源网址,以便您可以加载引荐来源网址锁定的图像。
Modern browsers have the Blob object:
The
headers
param will set the referrer so you can load referrer locked images.您尝试使用 XHR 请求位于不同域的资源,因此被阻止。使用 CORS 通过 XHR 进行跨域消息传递。
You are trying to request a resource using XHR that is on a different domain and is thus blocked. Use CORS for cross-domain messaging using XHR.
Krof Drakula 是对的,您无法从不同的域加载图像,但您真的需要这样做吗?您可以创建并附加一个
img
标签并等待它加载(使用 jQueryload()
之类的东西)。Krof Drakula is right, you cannot load an image from a different domain, but do you really need to do this? You can create and append an
img
tag and wait for it to load (with something like jQueryload()
).