<input type = ‘file’> для IE дает полный путь, нужно только имя файла - PullRequest
32 голосов
/ 04 февраля 2010

Когда выполняется загрузка из браузера IE, мой бэкэнд (org.apache.commons.fileupload) получает полный путь к файлу.

Для других браузеров, отличных от IE, он получает имя файла и все в порядке из-за безопасности.

Как получить имя файла только из ввода для IE?

Возможно ли это сделать в пользовательском интерфейсе, потому что я думаю, что редактировать его не очень изящноapache lib.

Может быть, для поля ввода существует какой-то параметр?

Я могу сделать это на сервере, но заинтересован в подходе пользовательского интерфейса.

Ответы [ 6 ]

45 голосов
/ 19 декабря 2013

Существует также опция IE под:

  • Свойства обозревателя
  • Вкладка «Безопасность»
  • В «Интернет» или «Интранет» нажмите на пользовательский уровень
  • В настройках безопасности прокрутите вниз, пока не увидите «Включить путь к локальному каталогу при загрузке файлов на сервер» и отключите его.
  • Нажмите «ОК» в окне «Свойства обозревателя» и обновитесь.

Alex

32 голосов
/ 19 января 2015

Попробуйте на стороне сервера:

Path.GetFileName(file.FileName)
21 голосов
/ 04 февраля 2010

Смысл ввода файла - предоставить файл . Имена, которые идут вместе с ним, «как бы ни хотелось использовать поставщику браузера», не гарантируют, что они вообще имеют какое-либо отношение к имени файла в файловой системе.

Вы не можете изменить то, что отправляет браузер.

Если вы собираетесь использовать имя, отправленное браузером, то необходимо , чтобы убедиться, что оно действительно для всего, что вы собираетесь с ним делать (например, убедитесь, что оно содержит только символы которые разрешены в именах файлов в вашей файловой системе). Это делает его чем-то, что должно обрабатываться на сервере (как и любые другие данные, предоставленные клиентом).

11 голосов
/ 12 июля 2017

Существует довольно простой обходной путь, если вы загружаете с помощью FormData через Xhr. API FormData.append позволяет передать имя файла в качестве третьего аргумента.

const formData = new FormData();
//explicitly setting the file name works in IE 11
formData.append('file', file, file.name);
3 голосов
/ 04 декабря 2014

Вы заинтересованы в подходе к пользовательскому интерфейсу.
Вы можете добавить скрытое поле ввода (или запись JSON), которое содержит только пустое имя файла, заполненное javascript.

Использование следующего кросс-браузера (включая IE) / функция платформы javascript (взято из мой ответ здесь , с полным объяснением и ссылкой), которая получает только имя файла:

function extractFilename(s){ 
  // returns string containing everything from the end of the string 
  //   that is not a back/forward slash or an empty string on error
  //   so one can check if return_value===''
  return (typeof s==='string' && (s=s.match(/[^\\\/]+$/)) && s[0]) || '';
} 
<input type="file" onchange="alert(extractFilename(this.value));">
1 голос
/ 19 мая 2018

Кажется, что это легко сделать со стороны сервера, но в зависимости от требований.

Я проверил это в рабочей среде и отлично работает.

String fileName = file.getName();
if (fileName != null) {
    fileName = FilenameUtils.getName(fileName);
}

IE по умолчанию дает полный путь вместе с именем файла, и это вызывает проблемы при загрузке файла из некоторого общего каталога. добавление приведенного выше фрагмента устранит проблему и хорошо работает во всех случаях.

...