В IE7 (и, вероятно, во всех известных браузерах, включая старый Firefox 2), если мы отправляем файл типа «// server1 / path / to / file / filename», он работает правильно и дает полный путь к файлу и имя файла.
Я понятия не имею, как преодолеть эту «новую функцию», потому что она приводит к тому, что все формы загрузки в моем веб-приложении перестают работать в Firefox 3.
Здесь есть серьезное недоразумение. Зачем вам когда-либо нужен полный путь к файлу на стороне сервера? Представьте, что я являюсь клиентом и у меня есть файл C:\path\to\passwords.txt
, и я даю вам полный путь к файлу. Как бы вы, будучи сервером, могли получить содержимое ? Есть ли у вас открытое TCP соединение с моей локальной файловой системой? Вы проверяли функциональность загрузки файлов, когда вы запускали веб-приложение в производство на другом сервере?
Он будет работать только тогда, когда и клиент и сервер будут работать на физически на одном и том же компьютере, поскольку у вас будет доступ к тому же жесткому диску файловая система. Это может произойти, только если вы локально разрабатываете свой веб-сайт и, таким образом, веб-браузер (клиент) и веб-сервер (сервер) по совпадению работают на одной машине.
То, что полный путь к файлу отправляется в MSIE и других древних веб-браузерах, связано с ошибкой безопасности . В спецификациях W3 и RFC2388 никогда не упоминается полный путь к файлу. Только имя файла. Firefox делает свою работу правильно.
Для обработки загруженных файлов вам не нужно знать полный путь к файлу. Вы должны быть заинтересованы в полном файле содержимое , которое клиент уже отправил на сервер в теле запроса в случае запроса multipart/form-data
. Измените свою форму, чтобы она выглядела следующим образом, как указано в RFC2388:
<form action="upload-script-url" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit">
</form>
Способ получения содержимого загруженного файла на стороне сервера зависит от используемого вами языка программирования на стороне сервера.
Java / JSP : вы хотели бы использовать HttpServletRequest#getPart()
или Apache Commons FileUpload API для его анализа. Вы должны получить InputStream
с содержимым файла, которое вы, в свою очередь, можете записать на любой OutputStream
на свой вкус. Вы можете найти пример в этот ответ .
Java / JSF : вы хотите использовать компонент <h:inputFile>
или любой другой компонент загрузки файлов, предоставляемый используемой библиотекой компонентов. Также здесь вы хотели бы получить содержимое файла со вкусом InputStream
. См. этот ответ для примера.
PHP : содержимое файла уже неявно хранится на временном диске. Вы хотите использовать функцию move_uploaded_file()
, чтобы переместить ее в нужное место. См. Также Руководство по PHP .
ASP.NET : подробного ответа от меня нет, так как я этого не делаю, но Google нашел несколько примеров для меня: Пример ASP.NET , Пример ASP.NET 2.0
Всякий раз, когда вы хотите получить часть имени загруженного файла, вы должны обрезать полный путь от имени файла. Эта информация совершенно не относится к вам. Также см., Например, эту Apache Commons FileUpload FAQ запись
Почему FileItem.getName () возвращает весь путь, а не только имя файла?
Internet Explorer предоставляет полный путь к загружаемому файлу, а не только базовое имя файла. Поскольку FileUpload предоставляет именно то, что было предоставлено клиентом (браузером), вы можете удалить эту информацию о пути в вашем приложении.