jQuery文件上传与IE10,零字节文件一起陷入挂起状态

我正在使用这个jQuery插件,并在我的网站上看到相同的结果,因为我可以在此演示中重现:

http://blueimp.github.io/jQuery-File-Upload/

即使演示文稿显示“上传服务器当前不可用”,您仍然可以通过转到演示并尝试上传零字节文件来重新创建问题(必须具有JPG,GIF或PNG扩展名,因为这是他们允许的全部内容)。

在FireFox和Chrome中,您将看到它尝试POST零字节文件。 在IE10中,如果您在开发人员工具中查看网络选项卡,您将看到XMLHTTPRequest对象处于“挂起”状态。 如果您在IE10中上传非零大小的文件,您还会看到它POST数据。

我搜索并发现只有其他人抱怨IE10中零字节文件的问题。 他们没有像我一样使用相同的jQuery插件,所以我认为这是一个普遍的IE10问题。 此外,我到目前为止找到的唯一答案是不允许用户上传零字节文件。 如果可能的话,我想支持零字节文件,它们在我的应用程序中有一些用法,我不时会自己使用它们,所以我应该让我的用户因为想要这个function而疯狂。

我有什么选择?

我有一个客户端也遇到了这个问题。 我不确定是什么导致它,但我会在混合中添加更多信息。

使用InPrivate窗口时问题消失了。 然后,我尝试清除缓存,清除cookie,并禁用所有加载项。 这并没有解决问题。

接下来,我从View |中重置了IE 互联网选项| 高级选项卡| 重置Internet Explorer设置。 我让用户保留他们的设置,如cookie和书签。 重启后,问题就消失了。 所以我猜测IE设置可能是造成这种情况的原因。

如果有其他人遇到这个问题,那么如果你可以运行几个测试场景并发表评论就会很有用。 也许我们可以缩小确切原因并修复。

  1. 测试将您的域添加到“安全”选项卡上的“受信任”站点列表,看看是否有所不同。
  2. 测试从我之前段落中讨论的相同位置到达的“重置高级设置”按钮。

仍然希望有更好的解决方案,但缺乏这一点,这将是我的答案:

$(elem).fileupload({ add: function(e, data) { var file = data.files[0]; if (file.size == 0 && ie >= 10) { ajaxPostFileNameOnly(file.name); } else { data.submit(); } } }); 

ie是我的应用程序中的全局变量,设置为IE版本,如果不是IE,则为0。 我知道特征检测通常更好,但在这种情况下不确定如何检测这个奇怪的问题,因为有些浏览器总是报告零作为文件大小(Safari我认为),我也不能总是相信这一点。

ajaxPostFileNameOnly是一个函数,它只是发出一个简单的AJAX请求来只发送文件名,而不是执行库所做的正常文件上传。

编辑:我现在最终只是这样做,这使得IE10像IE的早期版本一样工作,用于此文件上传库,只需使用iFrame进行传输。

 $(elem).fileupload({ forceIframeTransport: !!ie }); 

和一些代码来检测我从几个不同的SO答案放在一起的IE版本(警告,不会检测IE11 +,将最有可能报告为IE10):

 var ie = (function() { var undef, v = 3, div = document.createElement('div'), all = div.getElementsByTagName('i'); while ( div.innerHTML = '', all[0] ); /*@cc_on if (/^10/.test(@_jscript_version)) { v = 10; } @*/ return v > 4 ? v : undef; } ());