我创建了一个简单的文件上传页面。为了保持简单,我没有使用iFrame来包含文件输入。因此,文件提交会触发页面重新加载,因为表单已提交。为了在页面上显示上传的文件名,需要这样做。文件名是通过jQuery中的AJAX调用获取的。
一切都像Chrome,Firefox,Opera,Mac和Windows上的Safari一样迷人(我没有测试过Linux,但我觉得它也有效)
我的问题是在IE9中,当我打开浏览器时,会进行ajax调用并显示数据。但是一旦文件上传,这就停止了。
为了确定,服务器是在调试模式下启动的,我在服务方法中设置了一个断点。只要没有上传文件,就会达到断点。
一旦文件上传(顺便说一下,这就有效),就不会再到达断点了。 IE9不调用服务方法,数据不再更改。即使导航到另一个页面(google.com)并通过编写URL再次加载页面也无济于事。
这是我到目前为止在浏览器中看到的最奇怪的行为:提交表单并发送文件,但不执行后续的ajax调用,页面也不会更改。但javascript的行为就好像是在进行AJAX调用。只是服务器不再参与了。
这是表格:
<form method="post" action="${pageContext.request.contextPath}/services/prepop/upload/csv"
id="fileUploadForm" enctype="multipart/form-data">
<div class="file-upload">
<input id="uploadedFile"
type="file"
name="uploadedFile"
onchange="submit()"/>
</div>
<input type="hidden" name="formId" value='{{formId}}'/>
<input type="hidden" name="contentId" value='{{id}}'/>
<input type="hidden" name="page" value='upload'/>
</form>
这是ajax电话
app.log( "getting the form files" );
$.ajax( {
url:"${pageContext.request.contextPath}/services/jsonrest/prepop/list",
type:"GET",
async:true,
data:[
{name:"formId", value:formId}
],
success:function ( prepopContentList ) {
app.log( "the content file list was fetched with " + prepopContentList.length + " entries" );
upload.populateEntryList( prepopContentList, $( "#fileUploadList" ) );
}
} );
最奇怪的是,日志条目出现在日志中,但始终具有相同的值。在调试模式下查看内容可以确认这一点。数组总是一样的。
没有启用Comet。这是一个简单的jQuery应用程序。
如果有人有线索。
答案 0 :(得分:0)
看起来IE9试图了解缓存并缓存未明确设置为过期的所有内容。
我的解决方案是在抵达时更改响应(我使用泽西岛)到期。这是如何运作的。
正常回应:
return Response.ok( jsForms.toJSONString(), MediaType.APPLICATION_JSON_TYPE ).build();
过期回复:
return Response.ok( jsForms.toJSONString(), MediaType.APPLICATION_JSON_TYPE ).expires( new Date( 1000 ) ).build();
注意添加expires( new Date( 1000 ) )
这就是诀窍。