我该如何上传文件并获取表单中的其他参数?我想在Java servlet中处理多部分请求。
<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!)。
步骤1
阅读adatapost的文章。
步骤2
查看Apache Commons FileUpload项目。
O'Reily也提供了类似可行的解决方案,但它的使用许可证要求您购买一本书,而且这个要求表述得非常不清楚,因此我不会在这里再提供另一个链接。
步骤一
设置表单标签的enctype属性。
<form enctype="multipart/form-data" ....>
<input type="file" id="file1" name="file"/>
.... other stuff
</form>
第二步
阅读Justin的文章。
为了处理 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");
}
}
String file = FilenameUtils.getName(req.getOriginalFileName("myfile"))+"\\";
String message = req.getParameter("message");
这对IE7及以下版本无效。显然,您需要向表单添加另一个属性encoding ="multipart/form-data"。
javax.servlet.http.Part=request.getPart()
来获取文件和我传递的文件名.....但是当我从Glasfish 3切换到Tomcat 6.0.26时,这种方法不起作用了。 - Sangeet Menon