2015-04-01 109 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); 

評論我的情況下,任何問題。

相關問題