2015-04-01 4 views
11

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

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

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

+0

Что делать, если он не кэширует * upload * (о котором я никогда не слышал и был бы действительно странным), но сгенерированный результат? Этот результат отправляет правильные кеширующие (или, скорее, не кэширующие) заголовки? –

+0

@Pekka: Журналы сервера показывают браузер, выполняющий запрос POST, и возвращают 200 OK для каждой попытки загрузки. Если бы он кэшировал ответ, я ожидал, что Internet Explorer вообще пропустит запрос или сервер вернет статус 304 Not Modified. – Todd

+0

Какая технология используется на стороне сервера для обработки и обработки файла? Вы можете зарегистрировать контрольные суммы загруженных файлов, чтобы увидеть, действительно ли браузер отправляет неверный файл или что-то не так на стороне сервера. –

ответ

4

Вы можете проверить гипотезу с live demos posted on MS-Connect.

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

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

Таким образом, это не "кэширование" вещь вообще. Это ошибка отслеживания.

0

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

1

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

Например

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

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

автозаполнения = вкл/от/по умолчанию

  • на - Состояние включения указывает, что значение 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)); 

Если вы получаете несколько объектов для файла затем использовать уравнение (-2) после выбора, как

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

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

Смежные вопросы