【问题标题】:Dynamic form, with or without multipart/form-data动态表单,有或没有 multipart/form-data
【发布时间】:2011-05-03 07:11:28
【问题描述】:

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

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

如果我根本不使用 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;
}

【问题讨论】:

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


    【解决方案1】:

    根据其他答案的评论:

    我可以以任何方式将request.getParameterMap(); 与 multipart 一起使用吗?

    如果这是您唯一的要求,那么只需创建一个 Filter,它会执行解析工作并使用所有已解析的多部分项准备请求参数映射,以便您可以继续使用 getParameter()getParameterMap() 并与JSP/Servlet 中的常用方法。您可以找到此类过滤器的完整示例here

    【讨论】:

      【解决方案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);
      }
      }
      

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

      【讨论】:

      • @Achim:我编辑了我的问题以显示我隐藏的输入类型,我试图从中找到它是什么类型的操作。
      • 您是否检查过您的请求是多部分/文件上传? boolean isMultipart = ServletFileUpload.isMultipartContent(request);
      • @Achim:我修改并检查了。它是真实的,多部分的
      • 看看我的第一个回复,我加了几行。你应该看看我提供的 FileUpload 链接。这一切都在那里
      • @Achim:谢谢 :) 我知道 DiskFileItemFactory 和 ServletFileUpload> 我在我的适当处理程序类(创建和更新)中使用这些来上传文件并使用 item.isFormField()item.getFieldName() 我可以得到我想要的,但我想把它分开。所以问题是我可以在多部分中以任何方式使用request.getParameterMap(); 吗?我也在研究 oreilly 多部分解析器 servlets.com/cos/index.html 这可能也有帮助。
      【解决方案3】:

      您好,我设法解决了。 我正在使用 2 个请求和一个会话变量。

      第一次请求提交不带多部分的表单并将请求类型存储在会话变量中。

      一旦发送了第一个请求,就去进行相同形式的第二个请求,但这次使用 multipart 并检查您的会话变量值并执行适当的处​​理程序。

      【讨论】:

        猜你喜欢
        • 2017-10-11
        • 1970-01-01
        • 1970-01-01
        • 2021-03-04
        • 1970-01-01
        • 1970-01-01
        • 2016-04-22
        • 2014-10-27
        • 1970-01-01
        相关资源
        最近更新 更多