servle 3.0 新特性之一 对上传表单的支持

1. 上传

  * 上传对表单的要求:

    > method="post"

    > enctype="multipart/form-data",它的默认值是:application/x-www-form-urlencoded

    > <input type="file" name="必须给"/>

  * 上传Servlet的使用:

    > request.getParameter()不能再用

    > request.getInputStream()使用它来获取整个表单的数据!

使用 commons-fileupload 上传文件的步骤:

  * commons-fileupload

    > 创建工厂

    > 解析器

    > 使用解析器来解析request对象,得到List<FileItem>

  Servlet3.0对上传提供了支持:

  * 表单不变

  * 在Servlet中不需要再使用commons-fileupload,而是使用Servlet3.0提供的上传组件接口!

 

 

  上传的步骤:

  * 使用request.getPart("字段名"),得到Part实例,

  * Part:

   > String getContentType():获取上传文件的MIME类型

   > String getName():获取表单项的名称,不是文件名称

   > String getHeader(String header):获取指定头的值

   > long getSize():获取上传文件的大小

   > InputStream getInputStream():获取上传文件的内容

   > void write(String fileName):把上传文件保存到指定路径下

* 默认Servlet是不支持使用上传组件:需要给Servlet添加一个注解: @MultipartConfig

 

它没有提供获取上传文件名称的方法:

* 这需要我们自己从Content-Disposition头中截取!

 

例如:

前端 form上传表单页面:form.jsp

<body>

    <h1>注册</h1>

    <form action="<c:url value='/AServlet'/>" method="post" enctype="multipart/form-data">

        用户名:

        <input type="text" name="username" />

        <br />

        历:

        <input type="file" name="resume" />

        <br />

        <input type="submit" value="注册" />

    </form>

</body>

 

服务器端: Aservlet.java

import javax.servlet.http.Part;

/*

* 默认Servlet是不支持使用上传组件:需要给Servlet添加一个注解: @MultipartConfig

*/

@WebServlet(urlPatterns="/AServlet")

@MultipartConfig

public class AServlet extends HttpServlet {

    @Override

    public void doPost(HttpServletRequest req, HttpServletResponse resp)

            throws ServletException, IOException {

        req.setCharacterEncoding("UTF-8");

        /*

         * 1. getParameter()方法可以使用了!!!

         */

        String username = req.getParameter("username");//可以使用了!!!

        /*

         * 2. 获取文件表单字段,对应的Part对象

         */

        Part part = req.getPart("resume");

        

        /*

         * 3. Part中获取需要的数据

         */

        // 获取上传文件的MIME类型

        System.out.println(part.getContentType());

        // 获取上传文件的字节数

        System.out.println(part.getSize());

        // 获取文件字段名称

        System.out.println(part.getName());

        // 获取头,这个头中包含了上传文件的名称

        System.out.println(part.getHeader("Content-Disposition"));

        // 保存上传文件

        part.write("C:/xxx.jpg");

        

        // 截取上传文件名称

        String filename = part.getHeader("Content-Disposition");

        int start = filename.lastIndexOf("filename=\"") + 10;

        int end = filename.length() - 1;

        filename = filename.substring(start, end);

        System.out.println(filename);

    }

}

 

posted @ 2016-05-02 17:03  runningto  阅读(244)  评论(0编辑  收藏  举报