我正在向SPA应用程序添加文件上传功能。在最新版本的Chrome和Firefox中,文件上传工作完美,但IE 11间歇性地(可能5%-10%的时间)无法执行XHR请求。使用F12工具检查请求并没有提供多少有用的信息:
请求将无限期地停留在“待决”状态。
下面是我如何触发文件上传(使用jQuery):
function uploadFile() {
var formData = new FormData();
// filesToUpload is an Array<File>
formData.append('file', filesToUpload[0]);
$.ajax({
type: 'POST',
url: 'api/testupload',
data: formData,
contentType: false,
processData: false,
success: function() { ... },
error: function() { ... }
});
}
我注意到这通常发生在让页面站点空闲至少几分钟之后。
一旦一个POST
上载请求失败,所有后续的POST
上载请求都会失败。但是,如果在失败的GET
之后执行POST
请求,则后续的POST
通常可以工作。如果我让失败的POST
建立起来,浏览器就会变得没有响应能力(通常在六到七个“挂起”的POST
请求之后发生)。
是什么导致了这种间歇性故障?切换到<iframe>
上传会解决这个问题吗?这有可能是与网络有关的问题吗?或者服务器是如何响应的?或者我是如何配置和执行请求的?
编辑:
这里是我的文档的<head>
的相关部分
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="pragme" content="no-cache" />
</head>
编辑:(再次)
使用Wireshark,我可以看到正在发送带有该文件的POST
请求。
发布于 2015-10-27 19:34:12
我有一个类似的问题,解决办法是强制使用旧的iframe文件上传方法。
我的具体情况是:在IE11上使用SSO的应用程序上使用jquery文件上传插件(blueimp)会导致PUT请求陷入挂起状态。如果我不使用SSO登录到我的应用程序中,那么ajax文件上传工作就完美无缺。而且,与您的情况一样,使用GET请求似乎可以刷新内容,并允许下一个PUT文件上传请求工作。这个插件中的固定设置是forceIframeTransport: true
。
发布于 2017-04-28 12:03:37
我也有过同样的问题。上面的一条评论中提到的SetTimeout没有帮助。唯一能让它工作的方法是使用两个缓存: false和在失败的POST之后对假操作的GET请求。我是按顺序上传文件的,所以不可能建立超过一个失败的帖子。有一件事要提到--第一个失败的帖子从来没有返回错误,我只能捕捉到使用超时。下面是我使用的GET代码:
function reuploadChunk(fileNo, chunkNo) {
$.ajax({
url: "../SomeController/FakeAction/",
type: 'GET',
cache: false,
success: function () {
uploadChunk(fileNo, chunkNo);
},
error: function () {
setTimeout(reuploadChunk(fileNo, chunkNo), 1000);
}
});
}
与其说这是一个解决方案,不如说是一种解决方案,但好的是人们很快就会迁移到Win10,所以IE11不再是一个问题了。
如果您想要使用一个库,NeatUpload似乎在IE11中工作,但是它太旧了,所以我并不推荐它。
https://stackoverflow.com/questions/32380865
复制相似问题