【发布时间】:2011-01-12 22:46:37
【问题描述】:
如何上传文件并获取表单的其他参数?我想在 Java servlet 中处理多部分请求。
【问题讨论】:
标签: java servlets file-upload
如何上传文件并获取表单的其他参数?我想在 Java servlet 中处理多部分请求。
【问题讨论】:
标签: java servlets file-upload
要浏览并选择要上传的文件,您需要在表单中添加<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 Guide 和 Frequently Asked Questions 以查找代码示例并了解如何将其使用到最佳程度(考虑 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>
第二步
阅读贾斯汀的帖子。
【讨论】:
为了处理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");
【讨论】:
这不适用于 IE7 及以下版本。显然您需要在表单编码中添加另一个属性 =“multipart/form-data”
【讨论】: