Java servlet:multipart / form-data表单的问题

时间:2013-09-12 08:52:52

标签: java struts-1 multipartform-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);
        }
     }

通过运行第一段代码,执行else,但最后multipartItems为null。

因此,永远不会执行第二个代码段中的for。

我不知道为什么会有这种行为。我正在使用Struts 1.3.10

修改

如何检查struts是否已解析请求?

如果是这样,有没有办法只为特定表格关闭它?

编辑2

我有一个以json格式编码的动态表单。我有一个用于json和隐藏属性的表单bean。然后我“手动”解析json。一切都很完美,但现在我必须添加输入类型=文件字段并使用multipart / form-data enctype。

为了防止struts请求解析我输入了web.xml:

<init-param>
    <param-name>multipartClass</param-name>
    <param-value>none</param-value>
</init-param>

但它似乎不起作用

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

我已经使用这个例子来使用servlet上传文件,jsp对我来说很好。点击here

已经详细解释了示例,如果您遇到任何问题,请问我,我已经使用了它。