动态表单,包含或不包含multipart / form-data

时间:2011-04-29 07:12:11

标签: java html servlets file-upload multipartform-data

我正在java中设计一个简单的CRUD框架,在我的HTML页面中我有一个动态表单(2个带有multipart用于创建和更新文件上传,1个没有fileupload,multipart用于删除)。在服务器端,请求调制器使用request.getParameterMap();检查所有参数,并检查此隐藏类型输入<input type="hidden" name="returntype" value="Create">是否为创建,更新或删除操作。基于此,它将调用必要的处理程序。

  

注意:我的表单enctype和编码设置为 multipart / form-data   注意:我的paramMap.size()在这里返回0并且returnType变为null,因此我得到空指针异常。

如果我根本不使用enctype和编码它运行正常,但我的文件上传再次给我一个例外,编码类型应该是 multipart / form-data 。任何人都可以帮助我,我可以创建一个动态表单来创建一个CRUD吗?或者为什么我无法将request.getParameterMap();用于 multipart / form-data 谢谢:)

下面给出了请求调制器的代码

public String identifyNow()throws ServletException, java.io.IOException
{
    UploadXmlAgent uploadAgent;
    paramMap=request.getParameterMap();
    if (paramMap == null)
        throw new ServletException(
          "getParameterMap returned null in: " + getClass().getName());

    iterator=paramMap.entrySet().iterator();
    System.out.println(paramMap.size());
    while(iterator.hasNext())
    {
        Map.Entry me=(Map.Entry)iterator.next();
        if(me.getKey().equals("returntype"))
        {
            String[] arr=(String[])me.getValue();
            returnType=arr[0];
        }
    }

    //Identified based on returnType, instantiate appropriate Handler

    if(returnType.equals("Create"))
    {
        uploadAgent=new UploadXmlAgent(realPath,request,paramMap);
        uploadAgent.retrieveXml();
                    //SOME MORE OPERATIONS  
        return uploadAgent.uploadXml();
    }
    else if(returnType.equals("Update"))
    {
        System.out.println("Update");
        uploadAgent=new UploadXmlAgent(realPath,request,paramMap);
        uploadAgent.retrieveXml();
                    //SOME MORE OPERATIONS
        return uploadAgent.uploadXml();
    }
    else if(returnType.equals("Delete"))
    {
        //SOME OPERATIONS
    }
    return returnType;
}

3 个答案:

答案 0 :(得分:2)

也许你应该看看Commons IO FileUpload

为了改变提交的表单类型,您可以使用隐藏的输入字段

 <input type="hidden" name="formAction" value="uploadSomething">

然后,您可以在Servlet中使用它来执行操作,具体取决于您的表单

String act = request.getParameter("formAction");
if(act.equals("uploadSomething")
{ 
// EDIT
if(ServletFileUpload.isMultipartContent(request))
{

// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();

// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);

// Parse the request
List /* FileItem */ items = upload.parseRequest(request);
}
}

就是这样。 希望这会有所帮助。

答案 1 :(得分:2)

根据对其他答案的评论:

  

我可以以任何方式使用request.getParameterMap();使用多部分吗?

如果这是您的唯一要求,那么只需创建一个Filter来完成解析工作并准备请求参数映射以及所有解析的多部分项目,以便您可以继续使用getParameter(),{{ 1}}并在JSP / Servlet中采用通常的方式。您可以找到此类过滤器的完整示例here

答案 2 :(得分:-1)

您好我成功了。 我正在使用2个请求和一个会话变量。

提交没有multipart的表单的第一个请求,并将请求类型存储在会话变量中。

一旦发送第一个请求,请转到相同表单的第二个请求,但这次使用multipart并检查您的会话变量值并执行适当的处​​理程序。