7

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

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

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

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

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

我有哪些选择?

4

2 回答 2

6

我有一个客户也遇到了这个问题。我不确定是什么原因造成的,但我会在其中添加更多信息。

使用 InPrivate 窗口时问题消失了。然后我尝试清除缓存、清除 cookie 并禁用所有附加组件。那并没有解决问题。

接下来我从 View | 进行了 IE 重置。互联网选项 | 高级标签 | 重置 Internet Explorer 设置。我让用户保留他们的设置,如 cookie 和书签。重新启动后,问题就消失了。所以我猜测IE设置可能对此负责。

如果其他人遇到这种情况,如果您可以运行几个测试场景并发表评论,那将很有用。也许我们可以缩小确切的原因并修复。

  1. 测试将您的域添加到“安全”选项卡上的“受信任”站点列表中,看看这是否会有所不同。
  2. 测试从我前面段落中讨论的相同位置到达的“重置高级设置”按钮。
于 2013-07-18T13:46:23.603 回答
1

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

$(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
});

以及一些用于检测 IE 版本的代码,我将几个不同的 SO 答案放在一起(警告,不会检测到 IE11+,最有可能将它们报告为 IE10):

var ie = (function() {

var undef,
    v = 3,
    div = document.createElement('div'),
    all = div.getElementsByTagName('i');

while (
    div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
    all[0]
);

/*@cc_on
if (/^10/.test(@_jscript_version)) {
    v = 10;
}
@*/

return v > 4 ? v : undef;

} ());
于 2013-06-07T21:19:35.883 回答