Загрузка файлов кэширования в Internet Explorer?

У меня есть очень простая страница, которая включает элемент <input type="file">. Когда я отправляю форму с выбранным файлом, сервер отвечает электронной таблицей, которая открывается в Excel ( "новое окно" ). Следствием этого является то, что начальный экран и элемент ввода все еще видны в IE. Если я изменю данные на диске выбранного файла и повторно отправлю форму, Internet Explorer загрузит старое содержимое во второй раз; мои последние изменения отсутствуют в содержимом, отправленном на сервер. Если я снова выберу файл с помощью кнопки "Обзор"..., новое содержимое файла будет загружено, как ожидалось. Firefox всегда отправляет содержимое файла с диска, что является ожидаемым/желаемым поведением. Кажется, что Internet Explorer делает какое-то кэширование загруженного содержимого файла.

Есть ли способ отключить эту "функцию" и заставить IE извлекать данные с диска каждый раз при отправке формы?

Есть ли какая-либо документация по этому поведению? Это первый раз, когда я столкнулся с этим, и мои поиски в значительной степени опустели.

Ответ 1

Вы можете проверить гипотезу с живыми демонстрациями, опубликованными в MS-Connect.

[...] ошибка началась с IE10, когда были реализованы FileList и Blob.
input.files - это html5 FileList элементов file/blob.
Чтобы заполнить его, IE помечает каждый выбор файла. Они имеют "состояние моментального снимка" (термин W3C).
Они будут синхронизированы, если выбранный файл будет обновлен до отправки.
Ошибка заключается в том, что IE не обнаруживает, был ли файл удален, переименован или заменен.
В этом случае моментальный снимок filepicker устарел.

Вот что происходит, когда файл выбран в filepicker, а затем переименован и отредактирован, перед отправкой выбора filepicker. Хотя вместо него был заменен новый файл (с оригинальным именем файла), исходный файл (теперь с другим именем и измененным текстом) отправляется в форме. Как это возможно? Это похоже на отслеживание с помощью ntfs ObjectID, который используется с отслеживанием распределенных ссылок. Внимательно обратите внимание на этот снимок экрана, имя файла не согласуется с содержимым файла.

FileList-behaves-like-ObjectID-tracking.png

Итак, это вовсе не "кеширование". Это ошибка отслеживания.

Ответ 2

Вы пытались использовать атрибут autocomplete для вашего тега input?

Например

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

должно заставлять значение никогда не использоваться повторно, как указано в W3C docs:

autocomplete = on/ off/default

  • on - Состояние on указывает, что это значение не особенно чувствительно, и пользователь может рассчитывать на возможность полагаться на своего пользователя агент, чтобы запомнить значения, которые он ввел для этого элемента управления.
  • off. Состояние отключения указывает либо на то, что входные данные управления особенно чувствительны (например, код активации для ядерное оружие); или что это значение, которое никогда не будет повторно использовано (например, одноразовый ключ для входа в систему банка), и пользователь будет поэтому должны явно вводить данные каждый раз, а не будучи в состоянии полагаться на UA, чтобы превалировать ценность для него; или это документ обеспечивает свой собственный механизм автозаполнения и не хотите, чтобы пользовательский агент предоставил значения автозаполнения.

Ответ 3

Я не пробовал это сам, но вы можете попытаться использовать фиктивный параметр для действия формы и изменить его значение непосредственно перед каждым действием отправки. Например, если у вас есть <form action="foo.php">, измените это на <form action="foo.php?dummy=0">, а затем используйте javascript для изменения части действия, чтобы стать, например, action="foo.php?dummy=1" и т.д. непосредственно перед каждой отправкой.

Ответ 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);

Комментировать меня в случае возникновения каких-либо проблем.