精装机CORS选择性工作

精装机CORS选择性工作,cors,fine-uploader,Cors,Fine Uploader,我已经成功地使用了FineUploader,并且需要保存到不同的子域——example.com上的HTML代码,upload.example.com上的endpoint.php 每次在Safari上传几个小文件时,我都能让它正常工作。同样的小文件总是上传到FireFox和Mac上的Chrome上(最新版本截至2014年1月),但我只有在Mac上的FireFox和Chrome上选择性地获得成功反馈。尽管文件位于服务器上,但它始终具有“处理…”或百分比“61%” 当我把HTML代码放在upload.

我已经成功地使用了FineUploader,并且需要保存到不同的子域——example.com上的HTML代码,upload.example.com上的endpoint.php

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

当我把HTML代码放在upload.example.com上时,效果很好。我使用的是FineUploader定制版本(商业支持)v4.2.2,我已经为飞行前响应等更新了backend 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示例

瑞安


因为看起来您正在发送凭据,所以将
Access Control Allow Origin
头设置为请求的来源(对于生产来说显然不是一个好主意),而不是“*”

如果您没有在Fine Uploader中将
sendCredentials
设置为
true
,那么您可以使用通配符
访问控制允许源站

根据:

[…]在响应认证请求时,服务器必须指定域,并且不能使用通配符。如果标题通配符为:Access Control Allow Origin:*,则上述示例将失败


另外,来源于此答案:

如果请求挂起,则服务器没有提供任何响应,或者可能没有提供正确的响应。您需要显示所有请求流量,包括服务器的响应。需要像fiddler这样的代理人来收集这些信息。@RayNicholus感谢您的快速回复。我测试了一个虚拟endpoint.php,它为POST:handleCorsRequest()执行此操作;标题(“内容类型:文本/普通”);echo“{”success:“true”,uuid:“9999A18-a6c3-456e-bd06-e492f8a290c0”,“uploadName:“image1.jpg”}”;这愚弄了Safari,但只有偶尔在FF/Chrome上愚弄(成功)。我会尝试一些代理来看看我能收集到什么,但是考虑到Safari 100%工作,FF/chrome 80-90%的时间,除了JavaScript之外,我想不出任何东西会失败。这里没有JavaScript失败。您在上面发布的请求表明响应存在问题,因此问题出在服务器端。@RayNicholus Ray,关于代理的好提示。我正在使用HTTPScoop。使用endpoint.php CORS配置中的两个文件(我在选项响应中添加了访问控制最大年龄:15),我得到了两个代码200。前端显示一个成功,另一个处理,我在铬隐姓埋名。除了UUID和文件名之外,这两个响应文本都是相同的,都是文本/普通响应。如果它不在JavaScript中,但收到了正确的响应,并且在Safari中100%的时间都能正常工作,那么问题出在哪里呢?Chrome和FireFox中的bug?谢谢你的想法,FineUploader是一款很棒的产品。你在发送凭证吗?那么您是否尝试过将Access Control Allow Origin设置为请求的来源(对于生产来说显然不是一个好主意),而不是“*”?在Fine Uploader中是否启用了
allowCredentials
?谢谢标记,这已经解决了问题。我很惊讶这解决了问题,因为我知道没有需要发送的凭据。代理表示返回200代码,即使没有使用原始设置,这在我看来表明FineUploader或浏览器没有正确解释来自服务器的响应。我会很感兴趣,如果雷尼古拉斯有任何更多的想法,虽然我现在完成了项目,所以不能做详细的测试。不管怎样,我很高兴有一个解决方案。谢谢
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--