多部分上传文件servlet

时间:2010-02-04 06:02:38

标签: java servlets file-upload

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

5 个答案:

答案 0 :(得分:12)

要浏览并选择要上传的文件,您需要在表单中添加<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()中以多部分格式提供。为了测试(!),您可以使用以下代码段读取流:

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

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

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

答案 1 :(得分:5)

第1步

阅读adatapost的帖子。

第2步

查看Apache Commons FileUpload项目。

O'Reily有一个类似可行的解决方案,但它的使用许可要求你买一本书,即使这个要求是如此清晰,我也不会因为另一个链接而受益。

答案 2 :(得分:2)

<强>步骤1

设置enctype表单标记属性。

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

<强>步骤-2

阅读贾斯汀的帖子。

答案 3 :(得分: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类和getOriginalFileName()类的MultipartRequest方法。

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

答案 4 :(得分:0)

这对IE7及以下版本无效。显然,您需要在表单encoding =“multipart / form-data”

中添加另一个属性