Vin*_*243 5 javascript imgur cors dropzone.js
我尝试使用jQuery Dropzone将图像上传到Imgur或任何其他域,但这不起作用.
这是我的dropzone设置:
$("div.dropzone").dropzone
success: -> console.log arguments
paramName: "image"
method: "post"
maxFilesize: 2
url: "https://api.imgur.com/3/upload"
headers:
Authorization: "Client-ID *************"
Run Code Online (Sandbox Code Playgroud)
这不起作用.它表示返回码为0.请求标头:
Host: api.imgur.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:31.0) Gecko/20100101 Firefox/31.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Origin: http://my.opencubes.io
Access-Control-Request-Method: POST
Access-Control-Request-Headers: authorization,cache-control,x-requested-with
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Run Code Online (Sandbox Code Playgroud)
首先,你可以看到cient id没有出现:(.但是最大的问题是使用的方法是OPTIONS.响应头:

当我尝试将文件上传到我的另一个域时,我遇到了同样的问题(dropzone位于子域中)
在控制台中我看到:
Une demande multi-origines (Cross-Origin Request) a été bloquée : la politique « Same Origin » ne permet pas de consulter la ressource distante située sur https://api.imgur.com/3/upload. Ceci peut être corrigé en déplaçant la ressource sur le même domaine ou en activant CORS.
Run Code Online (Sandbox Code Playgroud)
哪个可以翻译
多源请求被阻止:策略"Same origin"不允许查看位于https://api.imgur.com/3/upload的远程资源.这可以通过在samin域上移动资源或启用CORS来修复.
pom*_*meh 16
OPTIONS请求是一个普通请求:这用于询问与CORS限制相关的权限.看看这个页面,了解CORS如何在幕后工作.
在您的情况下,这是一个纯粹的CORS相关问题.OPTIONS请求包含此标头:
Access-Control-Request-Headers: authorization,cache-control,x-requested-with
Run Code Online (Sandbox Code Playgroud)
这意味着:我可以在我的跨域AJAX请求中使用" 授权 "," 缓存控制 "和" x-requested-with "标头?
您得到的答复如下:
Access-Control-Allow-Headers :"Authorization, Content-Type, Accept, X-Mashape-Authorization"
Run Code Online (Sandbox Code Playgroud)
这意味着:您只能使用这些标题:"授权","内容类型","接受"和"X-Mashape-Authorization".
如您所见," cache-control "和" x-requested-with " 未列在允许列表中,导致浏览器拒绝该请求.
我来了2个测试代码示例,显示了这种行为:
var data = new FormData();
data.append('image', 'http://placehold.it/300x500');
var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.imgur.com/3/upload', true);
xhr.setRequestHeader('Authorization', 'Client-ID xxxxxxxxxx');
xhr.send(data);
Run Code Online (Sandbox Code Playgroud)
以下是运行此代码时发送的预检请求标头(如Firefox 30 devtools所示,我删除了不相关的标头,例如User-Agent,Accept ...):
以及相应的响应标题
在这里,我们可以看到我们提示访问"authorization"标头,并且服务器正在接受此标头,使用POST方法和任何源URL,因此满足CORS要求并且浏览器允许该请求.
var data = new FormData();
data.append('image', 'http://placehold.it/300x500');
var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.imgur.com/3/upload', true);
xhr.setRequestHeader('Authorization', 'Client-ID xxxxxxxxxx');
// the only difference with the previous code is this line
xhr.setRequestHeader('Cache-Control', 'no-cache');
xhr.send(data);
Run Code Online (Sandbox Code Playgroud)
预检请求的标题:
预检响应的标题(与示例1中的相同):
这里,"Access-Control-Request-Headers"标题提示访问服务器未提供的"cache-control",因此不满足 CORS要求,并且浏览器拒绝该请求.
这是一个JSFiddle引用您的问题的不同工作和不工作演示:http://jsfiddle.net/pomeh/Lfajnebh/.注意细节以了解正在发生的事情,几乎没有评论,但他们在这里强调代码中最棘手的部分.
作为奖励,我已经向DropZone的GitHub存储库发送了拉取请求来修复此问题(https://github.com/enyo/dropzone/pull/685),它允许您通过DropZone删除预定义的标头.试试看:
var myDropzone = new Dropzone('.dropzone', {
//...
headers: {
'Authorization': authorizationHeader,
// remove Cache-Control and X-Requested-With
// to be sent along with the request
'Cache-Control': null,
'X-Requested-With': null
}
});
Run Code Online (Sandbox Code Playgroud)
上面的代码应该与我的修补版本(https://github.com/pomeh/dropzone/commit/f0063db6e5697888582421865840258dec1ffdc1)一起使用,而上面的代码不应该:
var myDropzone = new Dropzone('.dropzone', {
//...
headers: {
'Authorization': authorizationHeader,
// remove Cache-Control and X-Requested-With
// to be sent along with the request
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11679 次 |
| 最近记录: |