我正在使用jQuery-File-Upload和jQuery-Iframe-Transport来尝试获得对旧版IE的支持。
我已将forceIframeTransport
选项设置为true
,以便它在所有浏览器中的行为大致相同,但我似乎没有在服务器端获得任何数据无论浏览器何时使用iframe传输。
我在服务器端吐出请求标头,然后我回来了:
array(
Host => "*******"
Connection => "keep-alive"
Content-Length => "0"
Accept => "*/*"
Origin => "**************"
X-Requested-With => "XMLHttpRequest"
User-Agent => "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17"
DNT => "1"
Referer => "***********"
Accept-Encoding => "gzip,deflate,sdch"
Accept-Language => "en-GB,en-US;q=0.8,en;q=0.6"
Accept-Charset => "ISO-8859-1,utf-8;q=0.7,*;q=0.3"
Cookie => "*********"
)
[*****
s表示泄露了信息;你不需要那个;)]
看起来没问题,但$_REQUEST
为空(即array()
),输入缓冲区也是空的:
$handle = fopen('php://input', 'r');
$file_data = '';
while(($buffer = fgets($handle, 4096)) !== false) {
$file_data .= $buffer;
}
fclose($handle); // $file_data = '';
当我没有使用iframe传输但是我需要IE支持时,这一切都运行良好...有没有人有使用iframe传输文件的经验,可能知道为什么没有数据通过?
当我使用jQuery-File-Upload / js / jquery.iframe-transport.js并强制使用iframe传输时,它可以在Chrome中运行,但请求甚至不会在IE中提供给服务器。
当我使用jquery-iframe-transport / jquery.iframe-transport.js并强制iframe传输时,它会在Chrome中中断,但这很好,因为Chrome支持正确的XHR文件传输,和请求至少命中IE中的服务器但是没有数据通过。
我已更新我的脚本以支持转移方法:
if(empty($_FILES)) {
$handle = fopen('php://input', 'r');
$file_data = '';
while(($buffer = fgets($handle, 4096)) !== false) {
$file_data .= $buffer;
}
fclose($handle);
} else {
$file_data = file_get_contents($_FILES['files']['tmp_name'][0]);
}
但是,无论我做什么,我仍然无法在IE中获得任何数据。
当我说“IE”时,我现在正专门在IE 8中进行测试。我需要支持回到7。 This guy声称一直支持IE 6。
答案 0 :(得分:10)
经过几个小时,我终于找到了问题。
首先,您需要使用来自bundled with jQuery-file-upload的传输插件,因为它是为它制作的;)我不太确定为什么另一个更进一步,但我会在一分钟。
我在IE中注意到我在核心jquery库中的某处获得了“访问被拒绝”的JavaScript错误。从我在网上看到的情况来看,这通常发生在你尝试提交到不同域名的网址时,我没有这样做,所以我驳回了它。
我正在比较两种不同的传输脚本的不同之处,当我在一个版本中说form.submit()
而在另一个版本中说form[0].submit()
时。所以我尝试添加[0]
,然后注意到“访问被拒绝”错误已更改为指向该行。很明显,它不喜欢我提交文件的地方。
我仔细检查了form.action
,网址看起来仍然很好。通过一些Google-fu,我发现如果事件不是来自原始/本机文件输入元素,您也会收到此错误。
我用一个奇特的输入取代了原生输入,然后在隐藏的原生输入上触发了“假”“点击”事件。这不喜欢。
取出我的虚假上传按钮并重新插入原生的(<input type="file"/>
fyi),现在一切都像所有浏览器中的魅力一样。好哇!
答案 1 :(得分:0)
为了它的价值......
我正在使用jQuery v1.9.1在文件上传到服务器之前同步对文件进行病毒扫描。如果文件有病毒,我们会返回HTTP 400,如果不是病毒则返回HTTP 200。
HTTP 400响应导致IE8“访问被拒绝”结果。
当我将服务器响应从400更改为401时,用户界面运行良好。
再次,“为了它的价值。”