Что происходит, когда вы выбираете несуществующий файл для загрузки в форме HTML? - PullRequest
2 голосов
/ 11 декабря 2008

В Internet Explorer стандартная форма загрузки файла HTML также позволяет напрямую вводить имя файла (вместо использования диалогового окна выбора файла). Это позволяет вводить несуществующие файлы. В других браузерах (которые не позволяют вам этого делать) я полагаю, что этот случай все еще может произойти, если вы удалите файл после его выбора.

Чтобы устранить ошибки, возникающие из-за этой проблемы (например, эта ), мне нужно добавить код проверки на стороне сервера (что возможно только в том случае, если запрос действительно поступает на сервер). в этом я не уверен на данный момент) или на стороне клиента (что не может быть очень простым, поскольку вы не можете получить доступ к реальному файлу из песочницы JavaScript). Кроме этого, кажется, что единственный (и, возможно, лучший) вариант - скрыть поле ввода с помощью магии CSS, как это делает GMail для файлов вложений.

Итак, что происходит, когда вы пытаетесь загрузить несуществующий файл? Все еще отправляется запрос POST? Или браузер прервет работу, и если это произойдет, как я могу это обнаружить?

Ответы [ 3 ]

2 голосов
/ 12 декабря 2008

Кажется, я понял это.

Прежде всего, кажется, что имеет значение, является ли это просто файл, который не существует, или весь путь неверен. Если отсутствует только файл, очевидно, что выполняется POST.

По крайней мере, в случае, который я упомянул (диалоговое окно загрузки изображений FCKEditor в WinXP и IE6), браузер вообще не отправляет форму (так что ничего не может быть сделано на стороне сервера).

Можно обнаружить проблему на клиенте, не используя обычную отправку формы, но имея обработчик onSubmit, который останавливает отправку (возвращает false) и вместо этого отправляет саму форму с помощью form.submit (). Если файл отсутствует, будет исключение.

try{
   form.submit();
}
catch (e){
// show some error message
}
return false;
0 голосов
/ 11 декабря 2008

Пост происходит, но, по крайней мере, в .Net, элемент управления System.Web.UI.WebControls.FileUpload имеет свойство HasFile, которое будет False (я пытался загрузить c: \ tmp \ foo.pdf). Проверка этого свойства перед обработкой предотвратит любые ошибки, связанные с отсутствующим файлом.

0 голосов
/ 11 декабря 2008

Действительно хороший вопрос, в .net есть Request.IsClientConnected, но не знаю, будет ли это работать для вас в этом случае, или вы вообще используете .net в первую очередь.

Я бы попробовал запустить его через Fiddler на стороне клиента и WireShark на стороне сервера, и посмотреть, получишь ли ты какие-то идеи, посмотрев на шаблоны трафика. После этого вы сможете определить, как это обнаружить.

Интересно посмотреть, что вы придумали. Извините, не могу дать лучшего ответа.

...