多部分上传文件Servlet

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

12
浏览并选择要上传的文件,您需要在表单中使用<input type="file">字段。根据HTML规范,您需要使用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()中可用。为了测试(!)目的,您可以使用以下片段读取流:
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个月),那么您需要自己解析流。解析这样的流需要精确的背景知识,了解多部分表单数据请求的规范和结构。要创建完美的多部分解析器,您将不得不编写很多代码。但幸运的是,Apache Commons FileUpload已经证明了其稳健性多年。仔细阅读用户指南常见问题,以查找代码示例并学习如何将其最大限度地利用(考虑MSIE!)。


感谢您在此发布Servlet 3.0的信息,即使正如您所指出的那样,询问者很可能不会使用它。我不知道3.0规范最终填补了这个巨大的漏洞。 - Justin Searls
BufferedReader reader = request.getReader(); //..稍微简短一点 - h3xStream
要使用Servlet 3.0,我们需要支持Java EE 6.0的Web服务器...你会推荐哪个呢?Tomcat支持吗?还是在使用Java SE 6.0时,GlassFish V3是更好的选择? - Sangeet Menon
@S.M.09,您不需要明确使用JEE6,只需要一个Servlet 3.0容器就足够了。例如Tomcat 7.0。当然,您也可以选择Glassfish 3。它也支持Servlet 3.0。 - BalusC
Tomcat 6.0.26支持Servlet3.0吗?我已经成功地使用Glassfish v3将文件和一些参数上传到服务器......我使用了javax.servlet.http.Part=request.getPart()来获取文件和我传递的文件名.....但是当我从Glasfish 3切换到Tomcat 6.0.26时,这种方法不起作用了。 - Sangeet Menon
1
@S.M.09 Tomcat 6.0不同于Tomcat 7.0 :) http://tomcat.apache.org/whichversion.html - BalusC

5

步骤1

阅读adatapost的文章。

步骤2

查看Apache Commons FileUpload项目。

O'Reily也提供了类似可行的解决方案,但它的使用许可证要求您购买一本书,而且这个要求表述得非常不清楚,因此我不会在这里再提供另一个链接。


2

步骤一

设置表单标签的enctype属性。

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

第二步

阅读Justin的文章。


5
请问您能否更精确地描述第二步“阅读贾斯汀的帖子 step 2”?我陷入了一个无限循环中。谢谢。 - Hubert
+1 感谢您的评论。第二步描述了如何使用 Commons FileUpload API。 - KV Prajapati

1

为了处理 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 类和 MultipartRequest 类的 getOriginalFileName() 方法。
String file = FilenameUtils.getName(req.getOriginalFileName("myfile"))+"\\";
String message = req.getParameter("message");

0

这对IE7及以下版本无效。显然,您需要向表单添加另一个属性encoding ="multipart/form-data"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接