При использовании multipart/form-data
обычными значениями поля ввода являются , а не , доступные для request.getParameter()
, поскольку стандартный Servlet API до версии 3.0 не имеет встроенных средств для их анализа. Именно поэтому существует Apache Commons FileUpload. Вам нужно проверить, возвращает ли FileItem#isFormField()
true
, а затем собрать их из FileItem
.
Прямо сейчас вы игнорируете эти значения в коде. Следует признать, что FileItem
- это вводящее в заблуждение имя, если бы это был я, я бы назвал его MultipartItem
или просто Part
, представляющий часть тела multipart/form-data
, которое содержит как загруженные поля, так и нормальные параметры.
Вот начальный пример того, как вы должны правильно проанализировать multipart/form-data
запрос:
List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : items) {
if (item.isFormField()) {
// Process normal fields here.
System.out.println("Field name: " + item.getFieldName());
System.out.println("Field value: " + item.getString());
} else {
// Process <input type="file"> here.
System.out.println("Field name: " + item.getFieldName());
System.out.println("Field value (file name): " + item.getName());
}
}
Обратите внимание, что вы также упустили из виду неправильное поведение MSIE, так как оно отправляет полный клиентский путь вдоль имени файла. Вы хотите удалить его из item.getName()
согласно FileUpload FAQ :
String fileName = item.getName();
if (fileName != null) {
filename = FilenameUtils.getName(filename);
}