2016-04-21 6 views
1

Я использую Java Servlet для обработки формы HTML и включает в себя входной файл элемент:Почему Servlet считает, что мой пустой элемент HTML-файла имеет в нем файл?

<input type="file" id="fileUpload" name="file" multiple /> 

Я использовал пример кода в this excellent answer для обработки нескольких файлов одновременно. Код, который я использую:

List<Part> fileParts = req.getParts().stream().filter(part -> "file".equals(part.getName())).collect(Collectors.toList()); // Retrieves <input type="file" name="file" multiple="true"> 
for (Part filePart : fileParts) { 
      String fileName = filePart.getSubmittedFileName(); 
      InputStream fileContent = filePart.getInputStream(); 
      // Do stuff here 
} 

Этот код отлично работает. Моя проблема заключается в том, что когда я ничего не прикрепляю, мой код все еще считает, что в файлеPartS есть объект Part. Выполняя некоторую отладку, объект Part, кажется, существует, но, конечно, для InputStream или SubmittedFileName не существует, поскольку я не загружал файлы. Почему это? Я новичок в лямбда-функциях и коллекциях, но похоже, что эта сборка «FileParts» должна быть пустой, когда я не выбираю файлы для загрузки.

+1

Проверьте браузер сетевой консоли. Представляет ли он вход пустой? Это все еще актуально. – Savior

ответ

1

Это как раз то, как работает HTML.

То же самое верно для нефайловых входов. Когда пустой вход отправляется, вы получаете пустое значение, а не null. Разница значительна. Значение null представляет собой отсутствие поля ввода. Это особенно полезно, когда форма имеет несколько кнопок отправки, и вы хотите, чтобы кнопка distinguish нажата.

<input type="text" name="foo"> Учитывая,

String foo = request.getParameter("foo"); 

if (foo == null) { 
    // foo was not submitted at all. 
} else if (foo.isEmpty()) { 
    // foo is submitted without value. 
} else { 
    // foo is submitted with a value. 
} 

И <input type="file" name="bar">,

Part bar = request.getPart("bar"); 

if (bar == null) { 
    // bar was not submitted at all. 
} else if (bar.getSize() == 0) { 
    // bar is submitted without value. 
} else { 
    // bar is submitted with a value. 
}