2015-04-01 63 views
11

我有一个非常基本的页面,其中包含一个<input type="file">元素。当我选择一个文件提交表单时,服务器会回复一个在Excel中打开的电子表格(一个“新窗口”)。这种行为的含义是初始屏幕和输入元素在IE中仍然可见。如果我更改所选文件磁盘上的数据并重新提交表单,则Internet Explorer会再次上传旧内容;发送到服务器的内容中没有我最新的更改。如果我再次通过输入的浏览...按钮选择文件,则新文件的内容将按预期上传。 Firefox始终从磁盘发送文件的内容,这是预期/期望的行为。似乎Internet Explorer正在对上传的文件内容进行某种缓存。Internet Explorer缓存文件上传?

有没有什么办法可以禁用这个“功能”,每次提交表单时IE都会从磁盘中提取数据?

有没有关于此行为的任何文档?这是我第一次遇到它,我的搜索很大程度上是空的。

+0

如果它没有缓存* upload *(我从来没有听说过,会很奇怪)但是生成的结果呢?那个结果是发送适当的缓存(或,而不是缓存)标头? – 2015-04-01 21:23:44

+0

@Pekka:服务器日志显示浏览器发出POST请求,并为每次上传尝试返回200 OK。如果缓存响应,我希望看到Internet Explorer完全跳过该请求,或者服务器返回304 Not Modified状态。 – Todd 2015-04-02 13:44:37

+0

服务器端使用什么技术来处理上传和处理文件?您可以记录上传的文件的校验和,看看浏览器是否实际上发送了错误的文件,或者服务器端是否有其他问题 – 2015-04-02 16:31:54

回答

4

你可以用live demos posted on MS-Connect来测试猜想。

该错误从IE10开始,当FileList和Blob被实现时。
input.files是file/blob项目的html5 FileList。
要填充它,IE blob每个filepicker的选择。他们有一个“快照状态”(W3C术语)。
在提交之前更新所选文件的情况下,它们会保持同步。
错误在于,IE未能检测到文件是否被删除,重命名或替换。
在这种情况下,filepicker快照会失效。

这里是当filepicker选择文件会发生什么,然后更名为编辑,提交filepicker选择之前。尽管新文件(原始文件名)已替换其位置,但原始文件(现在与不同名称和修改后的文本)将在窗体中发送。这怎么可能?就好像它是通过ntfs ObjectID跟踪的,它与Distributed Link Tracking一起使用。在此截图中请仔细注意,文件名称与文件内容不一致。

所以,这不是一个 “缓存” 的东西都没有。这是一个跟踪错误。

0

我没有尝试过这个,但是您可能想尝试在表单操作中使用虚拟参数,并在每次提交操作之前更改其值。例如,如果您有<form action="foo.php">,请将其更改为<form action="foo.php?dummy=0">,然后使用javascript将操作部分更改为例如action="foo.php?dummy=1"等等。

1

您是否尝试过为input标记使用autocomplete属性?

例如

<input type="text" autocomplete="off" /> 

应强制值被从未被重用W3C docs指出:

自动填充=开/ 关闭 /默认

  • 上 - on状态表示val ue不是特别敏感,并且用户可以期望能够依靠其用户代理来记住他为该控件输入的值。
  • off - 关闭状态表示控件的输入数据特别敏感(例如核武器的激活码);或者它是一个永远不会被重用的值 (例如用于银行登录的一次性密钥),并且因此用户将因此每次必须明确地输入数据,而不是 能够依赖于UA为他预先填写价值;或者该文档提供了自己的自动完成机制,并且不需要 希望用户代理提供自动完成值。
0

我在IE 10,11中遇到过同样的问题。我能够解决它使用下面的代码

var file = $('input[type="file"]'); 
file.removeAttr('value'); 
var cloneFile = file.clone(); 
file.parent().get(0).replaceChild(cloneFile.get(0), file.get(0)); 

如果您收到多对象文件,然后选择使用后EQ(-2)像

$('input[type="file"]').eq(-2); 

评论我的情况下,任何问题。

相关问题