Java servlet:多部分/表单数据表单问题

Java servlet:多部分/表单数据表单问题,java,struts-1,multipartform-data,Java,Struts 1,Multipartform Data,我有一个包含一些和字段的多部分/表单数据表单 我使用这个代码 List<FileItem> multipartItems = null; boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (!isMultipart) { System.out.println("false"); } else { FileItemFactory factory = new DiskFile

我有一个包含一些
字段的多部分/表单数据表单

我使用这个代码

 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();
       }

      }
List multipartItems=null;
布尔值isMultipart=ServletFileUpload.isMultipartContent(请求);
如果(!isMultipart){
System.out.println(“假”);
}否则{
FileItemFactory=new DiskFileItemFactory();
ServletFileUpload upload=新的ServletFileUpload(工厂);
多部分项=空;
试一试{
multipartItems=upload.parseRequest(请求);
System.out.println(“true”+多部分项.toString());
}捕获(文件上载异常){
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);
        }
     }
Map参数Map=newhashmap();
对于(FileItem multipartItem:multipartItems){
if(multipartItem.isFormField()){
processFormField(多部分,参数Map);
}否则{
request.setAttribute(multipartItem.getFieldName(),multipartItem);
}
}
通过运行第一段代码,将执行else,但最后多部分项为null

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

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

编辑

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

如果是的话,有没有办法只对特定的表单关闭它

编辑2

我有一个动态表单,用json格式编码。我有一个用于json和隐藏属性的表单bean。然后我“手动”解析json。所有这些都可以很好地工作,但现在我必须添加input type=file字段并使用multipart/form数据类型

为了防止struts请求解析,我在web.xml中添加了:

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

多类
没有一个

但它似乎不起作用

初始化文件项,如下所示:

     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;
}

我使用这个例子使用servlet上传文件,jsp对我来说运行良好。点击


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

如果您使用的是Struts,而Struts是自动处理的,那么您为什么要这样做?如果是在servlet中,为什么要用Struts标记这个问题?@DaveNewton:我有一个动态表单,用json格式编码。我有一个用于json和隐藏属性的表单bean。然后我“手动”解析json。所有这些都可以很好地工作,但是现在我必须添加input type=file字段并使用multipart/form数据类型。您使用struts 1.3.x吗?如果是这样,您是否以某种方式禁用了struts多部分请求处理?问题是struts已经解析了该请求,因此无法再次解析该请求。此外,我没有找到禁用struts Parsing的方法。我使用struts 1.2浏览和上传图像。问题是struts已经解析了请求,因此无法再次解析。此外,我没有成功地找到禁用struts Parsing的方法。你的表单enctype是什么?enctype=“multipart/form data”我已经使用过。如果struts先解析请求,我无法成功地理解如何再次解析请求。