【问题标题】:Multi part upload file servlet [duplicate]多部分上传文件servlet [重复]
【发布时间】:2011-01-12 22:46:37
【问题描述】:

如何上传文件并获取表单的其他参数?我想在 Java servlet 中处理多部分请求。

【问题讨论】:

    标签: java servlets file-upload


    【解决方案1】:

    要浏览并选择要上传的文件,您需要在表单中添加<input type="file"> 字段。如HTML specification 中所述,您需要使用POST 方法,并且表单的enctype 属性必须设置为multipart/form-data

    <form action="uploadServlet" method="post" enctype="multipart/form-data">
        <input type="file" name="file" />
        <input type="submit" />
    </form>
    

    提交这样的表单后,表单数据在HttpServletRequest#getInputStream() 中以多部分格式提供。出于测试(!)目的,您可以使用以下 sn-p 读取流:

    BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
    for (String line; (line = reader.readLine()) != null;) {
        System.out.println(line);
    }
    

    但是,您需要逐字节解析流(而不是逐字符)。在全新的Servlet 3.0 API 之前,标准的Servlet API 没有提供任何内置的工具来解析它们。普通表单字段也不可用通常的request.getParameter() 方式,它们包含在多部分表单数据流中。

    如果您还没有使用 Servlet 3.0(仅比 2 monts 旧),那么您需要自己解析流。解析这样的流需要对多部分表单数据请求如何specified and structured 的精确背景知识。要创建一个完美的多部分解析器,您必须编写大量代码。但幸运的是,Apache Commons FileUpload 多年来已经证明了它的稳健性。仔细阅读 User GuideFrequently Asked Questions 以查找代码示例并了解如何将其使用到最佳程度(考虑 MSIE!)。

    【讨论】:

    • 感谢您在此处发布有关 Servlet 3.0 的信息作为仅供参考,尽管正如您所指出的,提问者不太可能使用它。我不知道 3.0 规范终于填补了这个巨大的漏洞。
    • BufferedReader reader = request.getReader(); //..有点短
    • 要使用 Servlet 3.0,我们需要支持 Java EE 6.0 的 Web 服务器...您有什么建议? Tomcat是否支持它...?或者当我们使用 Java SE 6.0 时 GlassFish V3 是更好的选择
    • @S.M.09 您并不明确需要 JEE6。只需一个 Servlet 3.0 容器就足够了。例如 Tomcat 7.0。您当然也可以继续使用 Glassfish 3。它还支持 Servlet 3.0。
    • @S.M.09 Tomcat 6.0 与 Tomcat 7.0 不同 :) tomcat.apache.org/whichversion.html
    【解决方案2】:

    第 1 步

    阅读 adatapost 的帖子。

    第 2 步

    查看Apache Commons FileUpload 项目。

    O'Reily 提供了一个类似可行的解决方案,但它的使用许可要求您购买一本书,而且即使该要求的表述也很差,我不会再通过另一个链接来受益。

    【讨论】:

      【解决方案3】:

      第一步

      设置 enctype 表单标签属性。

      <form enctype="multipart/form-data" ....>
         <input type="file" id="file1" name="file"/>
         .... other stuff
      </form>
      

      第二步

      阅读贾斯汀的帖子。

      【讨论】:

      • 拜托,您能否更准确地描述您的第 2 步“阅读贾斯汀的帖子第 2 步”。我陷入了无限循环。谢谢。
      • +1 感谢您的评论。第二步描述Commons FileUpload API的使用。
      【解决方案4】:

      为了处理enctype="multipart/form-data"我们不能直接使用request.getParameter()

      现在来处理问题

      现在,将文件上传到服务器,可以有多种方式。但是,我将使用 oreilly 提供的 MultipartRequest 类。要使用这个类,你必须有 cos.jar 文件。

      public class UploadServlet extends HttpServlet 
      {  
      
          public void doPost(HttpServletRequest request, HttpServletResponse response)                     throws ServletException, IOException 
          {           
              MultipartRequest m=new MultipartRequest(request,"d:/new");  
              out.print("successfully uploaded");  
          }  
      }  
      

      这会将您的文件上传到 d:/new

      现在检索多部分请求的参数 您必须使用FilenameUtils 类和getOriginalFileName() 类的getOriginalFileName() 方法。

      String file = FilenameUtils.getName(req.getOriginalFileName("myfile"))+"\\";
      String message = req.getParameter("message");
      

      【讨论】:

        【解决方案5】:

        这不适用于 IE7 及以下版本。显然您需要在表单编码中添加另一个属性 =“multipart/form-data”

        【讨论】:

          猜你喜欢
          • 2013-12-09
          • 2014-03-21
          • 2017-01-28
          • 1970-01-01
          • 1970-01-01
          • 2012-07-30
          • 1970-01-01
          • 2014-10-10
          • 1970-01-01
          相关资源
          最近更新 更多