Java-сервлет: проблема с формой multipart/form-data
У меня есть форма multipart/form-data с некоторыми <input type='text'>
а также <input type='file'>
поля.
Я использую этот код
List<FileItem> multipartItems = null;
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (!isMultipart) {
System.out.println("false");
} else {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
multipartItems = null;
try {
multipartItems = upload.parseRequest(request);
System.out.println("true "+multipartItems.toString());
} catch (FileUploadException e) {
e.printStackTrace();
}
}
выяснить, имеет ли форма многочастный контент. Затем я использую
Map<String, String[]> parameterMap = new HashMap<String, String[]>();
for (FileItem multipartItem : multipartItems) {
if (multipartItem.isFormField()) {
processFormField(multipartItem, parameterMap);
} else {
request.setAttribute(multipartItem.getFieldName(), multipartItem);
}
}
При запуске первого фрагмента кода выполняется остальное, но в конце multipartItems имеет значение null.
По этой причине фрагмент кода во втором коде никогда не выполняется.
Я не знаю, почему существует такое поведение. Я использую Struts 1.3.10
РЕДАКТИРОВАТЬ
Как я могу проверить, что распорки уже проанализировали запрос?
Если так, есть ли способ отключить его только для определенной формы?
РЕДАКТИРОВАТЬ 2
У меня есть динамическая форма, закодированная в формате JSON. У меня есть форма bean для JSON и скрытых свойств. Затем я анализирую JSON "вручную". Все работает отлично, но теперь я должен добавить поля ввода type=file и использовать многостраничный /form-data enctype.
Для предотвращения разбора запроса распорок я поместил в web.xml:
<init-param>
<param-name>multipartClass</param-name>
<param-value>none</param-value>
</init-param>
Но это не похоже на работу
2 ответа
Инициализируйте FileItem, как показано ниже:
FileItem fileItem = null;
Затем вызовите этот метод
public boolean getParameters(HttpServletRequest request, PrintWriter out) {
List fileItemsList = null;
try {
if (ServletFileUpload.isMultipartContent(request)) {
ServletFileUpload servletFileUpload = new ServletFileUpload(new DiskFileItemFactory());
try {
fileItemsList = servletFileUpload.parseRequest(request);
} catch (FileUploadException ex) {
}
String optionalFileName = "";
Iterator it = fileItemsList.iterator();
while (it.hasNext()) {
FileItem fileItemTemp = (FileItem) it.next();
if (fileItemTemp.isFormField()) {
// for other form fields that are not multipart
// if (fileItemTemp.getFieldName().equals("commonName")) {
// commonName = fileItemTemp.getString();
// }
} else {
if (fileItemTemp.getFieldName().equals("media_file")) {
fileItem = fileItemTemp;
}
}
}
}
} catch (Exception e) {
}
return true;
}
Я использовал этот пример для загрузки файла с использованием сервлета, и JSP работает нормально для меня. Нажмите здесь
Пример был подробно объяснен, и если у вас возникнут какие-либо проблемы, спросите меня, я использовал это.