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 работает нормально для меня. Нажмите здесь

Пример был подробно объяснен, и если у вас возникнут какие-либо проблемы, спросите меня, я использовал это.

Другие вопросы по тегам