FineUploader CORS有选择地工作

时间:2014-01-24 16:43:13

标签: cors fine-uploader

我一直在成功使用FineUploader,并且需要保存到不同的子域 - example.com上的HTML代码,upload.example.com上的endpoint.php。

我每次在Safari上传几个小文件时都能正常工作。这些相同的小文件总是在Mac上的FireFox和Chrome上传(截至2014年1月的最新版本),但我只能在Mac上选择性地使用FireFox和Chrome获得成功反馈。它始终具有“正在处理...”或百分比“61%”,尽管该文件位于服务器上。

当我将HTML代码放在upload.example.com上时,它运行正常。我正在使用FineUploader自定义构建(商业支持)v4.2.2,我已经更新了后端endpoint.php以进行预检响应等。问题是POST请求无限期挂起,无论服务器设置为什么。我甚至创建了一个假的JSON响应器,除了用JSON成功字符串响应之外什么也没做。

...
else if ($method == "POST") {
    handleCorsRequest();
    header("Content-Type: text/plain");
    echo '{"success":true,"uuid":"99999a18-a6c3-456e-bd06-e492f8a290c0","uploadName":"image1.jpg"}';
}
...

我认为JSONP可能需要读取响应,而没有FineUploader不知道发生了什么。但是,就我所知,FineUploader不会发送回调字段。

有什么想法吗?很高兴澄清。以下是无限期挂起的飞行前请求,响应和POST的示例。

赖安

REQUEST ACCORDING TO PROXY:
Referer: http://example.com/?folder=TestFolder&id=1051&jobname=Test
Cache-Control: no-cache
Connection: keep-alive
Origin: http://example.com
Accept-Language: en-US,en;q=0.8
Accept: */*
Content-Length: 51729
Host: upload.example.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryxBA8idxO6Luv7Ipc
Accept-Encoding: gzip,deflate,sdch
X-Requested-With: XMLHttpRequest

RESPONSE ACCORDING TO PROXY, RETURN CODE 200:
Date: Fri, 24 Jan 2014 19:14:38 GMT
Server: Apache
Content-Type: text/plain
Connection: Keep-Alive
MS-Author-Via: DAV
Access-Control-Allow-Origin: *
X-Powered-By: PHP/5.3.15
Content-Length: 88
Keep-Alive: timeout=15, max=99

RESPONSE TEXT ACCORDING TO PROXY:
{"success":true,"uuid":"f0365869-312b-4080-bc30-1792e24fe366","uploadName":"image1.jpg"}

POSTED DATA:
------WebKitFormBoundaryxBA8idxO6Luv7Ipc
Content-Disposition: form-data; name="qquuid"

f0365869-312b-4080-bc30-1792e24fe366
------WebKitFormBoundaryxBA8idxO6Luv7Ipc
Content-Disposition: form-data; name="qqfilename"

image1.jpg
------WebKitFormBoundaryxBA8idxO6Luv7Ipc
Content-Disposition: form-data; name="qqtotalfilesize"

51200
------WebKitFormBoundaryxBA8idxO6Luv7Ipc
Content-Disposition: form-data; name="qqfile"; filename="image1.jpg"
Content-Type: image/jpeg

{binary data}
------WebKitFormBoundaryxBA8idxO6Luv7Ipc--

1 个答案:

答案 0 :(得分:0)

由于看起来您正在发送凭据,因此请将Access-Control-Allow-Origin标头设置为请求的来源(显然不是生产的好主意),而不是' *'。

如果您没有在Fine Uploader中将sendCredentials设置为true,那么您可以使用通配符Access-Control-Allow-Origin

根据MDN

  

[...]在响应凭证请求时,服务器必须指定域,并且不能使用通配符。如果标头被通配为:Access-Control-Allow-Origin:*。

,则上述示例将失败

另外,来自这个答案:CORS: Cannot use wildcard in Access-Control-Allow-Origin when credentials flag is true