【问题标题】:Sending additional data with multipart [duplicate]使用多部分发送附加数据[重复]
【发布时间】:2013-02-12 20:39:10
【问题描述】:

我正在使用apache-commons-fileupload 将文件从client 获取到server。(使用JSP 和Servlet)。

JSP/HTML

<form method="POST" action="GetFile" enctype="multipart/form-data">
<input type="file" name="datafile">
<input type="text" name="text1">
<input type="submit" value="Next">
</form>

Servlet:GetFile

System.out.println(request.getParameter("text1"));

我能够将文件上传到服务器,但我无法在servlet 中获得text1 的值(我在servlet 中获得null 的text1 值) ,我需要表单中的这个textfield 来提交一些附加信息,同时将其上传到server。

  • 是enctype="multipart/form-data" 表单选项不允许其他 要提交的表单数据?如果它不允许,那么我必须将这个额外的 textfield 发送到 server 的其他选项是什么。
  • 或者我的代码还有其他问题吗?

【问题讨论】:

  • 可以使用javascript或者jquery来设置textfield中的数据
  • @Biswajit 与 OP 的问题无关。
  • name="text1" 的输入字段多吗?原因 request.getParameter(...) 仅获取参数的第一个值,如果您有更多具有相同 name 属性的参数,则第一个值可能为空,因此为 null。
  • @Biswajit 为什么你认为使用 js/jquery 设置字段会有所帮助?

标签: java jsp servlets file-upload apache-commons-fileupload


【解决方案1】:

是enctype="multipart/form-data" 表单选项不允许其他 要提交的表单数据?如果它不允许,那么是什么 其他选项我必须将此附加文本字段发送到服务器。

不,使用enctype="multipart/form-data" 没有问题。您可以获取其他字段,然后以这种形式归档。

或者我的代码还有其他问题吗?

是的,就目前而言。使用enctype="multipart/form-data" 时不能直接使用request.getParameter(name); 获取参数。在使用它时,表单字段不能作为请求的参数,它们包含在流中,因此您无法以正常方式获取它。您可以在 the docs of using commons-fileupload#Processing the uploaded items 中找到一种方法。

【讨论】:

  • 谢谢(和 +1),它有效。
【解决方案2】:
MultipartRequest req = new MultipartRequest(request, UPLOAD_PATH, 1024 * 1024 * 1024);
    out.print(req.getParameter("contractNo"));
    out.println("<BR>");
    Enumeration files = req.getFileNames();
    while (files.hasMoreElements()) {
        String name = (String) files.nextElement();
        String filename = req.getFilesystemName(name);
        String type = req.getContentType(name);
        File uploadedFile = req.getFile("xlFile");
        FileInputStream fis = new FileInputStream(uploadedFile);
        BufferedReader in = new BufferedReader(new InputStreamReader(fis));

        FileWriter fstream = new FileWriter(UPLOAD_PATH + name, true);
        BufferedWriter out11 = new BufferedWriter(fstream);

        String aLine = null;
        while ((aLine = in.readLine()) != null) {
            //Process each line and add output to Dest.txt file
            out11.write(aLine);
            out11.newLine();
        }

        // do not forget to close the buffer reader
        in.close();

        // close buffer writer
        out11.close();
    }

以上代码将读取文件以及其他表单数据只需查看req.getParameter();MultipartRequest req对象的方法

【讨论】:

    【解决方案3】:

    在 Servlet 中检索 HTML 表单字段的最佳做法是使用 apache commons-fileupload 1.3 jar。

    使用iterator遍历multipart HTTPServletRequest并使用for循环检查是否为isFormField(),然后

       String item1=null,item2=null,item3=null;
    
        if(item.isFormField())
        {
    
    
            if(item.getFieldName().equals("field1"))
            {   
              item1=item.getString();
            }
    
    
            if(item.getFieldName().equals("field2"))
            {   
                 item2=item.getString();
            }
    
    
    
            if(item.getFieldName().equals("field3"))
            {   
                 item3=item.getString();
            }
    
    
        }
    

    你的 HTML 文件应该是这样的

    <html>
    <body>
    <form action="servletname" method="post" enctype="multipart/form-data">
    
    <input type="text" name="field1">
    <input type="text" name="field2">
    <input type="text" name="field3">
    <input type="file" name="filetoupload">
    <input type="submit" value="Upload">  
    
    </form>
    </body>
    </html>
    

    【讨论】:

      【解决方案4】:
      1. 下载jar文件com.oreilly.servlet.MultipartRequest
      2. 在Web-Inf/classes 中包含的servlet / .java 文件中导入com.oreilly.servlet.MultipartRequest
      3. 在您的 servlet 中添加 doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 方法

        MultipartRequest m=new MultipartRequest(request, "C:\SavingDirectory");

      然后从下面的表格中调用你的变量;

      String pdate = m.getParameter("plandate");
      

      并从 servlet 中打印它们,例如 out.println(pdate);

      【讨论】:

        【解决方案5】:

        参数并没有丢失,只是它们是请求流的一部分。

        您必须从请求中获取所有项目并根据它们的项目类型进行相应的迭代和处理

        List  items = upload.parseRequest(request);
        

        获取途径如下

        // Process the uploaded items
        Iterator iter = items.iterator();
        while (iter.hasNext()) {
            FileItem item = (FileItem) iter.next();
        
            if (item.isFormField()) {
        
              String name = item.getFieldName();//text1
              String value = item.getString();
        
            } else {
                processUploadedFile(item);
            }
        }
        

        【讨论】:

        • 感谢(和 +1),它有效。
        • 我为我的错误搜索了一个小时,这里是解决方案。谢谢
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-18
        • 1970-01-01
        • 1970-01-01
        • 2013-02-07
        • 2016-09-09
        • 2012-03-21
        • 1970-01-01
        相关资源
        最近更新 更多