【问题标题】:Internet Explorer Caching File Uploads?Internet Explorer 缓存文件上传?
【发布时间】:2015-04-01 16:57:26
【问题描述】:

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

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

是否有任何关于此行为的文档?这是我第一次遇到它,我的搜索基本上都是空的。

【问题讨论】:

  • 如果它没有缓存 upload (我从来没有听说过而且会很奇怪)而是生成的结果怎么办?该结果是否发送了正确的缓存(或者,更确切地说,无缓存)标头?
  • @Pekka:服务器日志显示浏览器发出 POST 请求并为每次上传尝试返回 200 OK。如果它正在缓存响应,我希望 Internet Explorer 完全跳过该请求,或者让服务器返回 304 Not Modified 状态。
  • 服务器端使用什么技术来处理上传和处理文件?您可以记录上传文件的校验和,以查看浏览器是否实际上发送了错误的文件,或者服务器端是否出现其他问题
  • @Todd 你能指定你的IE版本吗?
  • 我遇到了这个问题,在Win7上使用IE11

标签: internet-explorer caching file-upload


【解决方案1】:

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

例如

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

应该强制值永远不会被重复使用,如W3C docs中所述:

自动完成 = 开启/关闭/默认

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你可以用live demos posted on MS-Connect来验证猜想。

      [...] 该错误始于 IE10,当时实现了 FileList 和 Blob。
      input.files 是文件/blob 项的 html5 FileList。
      为了填充它,IE Blobs 每个文件选择器选择。它们具有“快照状态”(W3C 术语)。
      它们会保持同步,以防在提交之前更新所选文件。
      问题是,IE 无法检测文件是否被删除、重命名或替换。
      在这种情况下,文件选择器快照会失效。

      这是在文件选择器中选择文件,然后在提交文件选择器选择之前重命名编辑时发生的情况。尽管新文件(具有原始文件名)已被替换,但原始文件(现在具有不同 名称 和修改后的文本)会以表格形式发送。这怎么可能?就好像它是通过 ntfs ObjectID 跟踪的,它与Distributed Link Tracking 一起使用。请注意,在此屏幕截图中,文件 name 与文件 content 不一致。

      所以,它根本不是“缓存”的东西。这是一个跟踪错误。

      【讨论】:

        【解决方案4】:

        我在 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);
        

        如有任何问题,请给我评论。

        【讨论】:

          猜你喜欢
          • 2016-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多