• 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);

        }

    }

  • 相关阅读:
    关于mybatisplus 中saveOrUpdateBatch的方法重写,不根据主键更新,mysql中主键使用自动填充UUID
    多线程写数据由于String造成的堆内存泄露(java.lang.OutOfMemoryError)
    修改登录超时时间
    神器如 dnSpy,无需源码也能修改 .NET 程序
    关联交易自动生成提示销售员一必录
    如何删除无效的服务
    磁盘上的数据库文件mdf已经被删除,如何删除SQLSERVER上的数据库列表中的数据库名称
    转换规则修改启动条件同步到正式环境不生效的问题
    mssql因为算法不同,客户端和服务器无法通信
    Jexus mono发布webform
  • 原文地址:https://www.cnblogs.com/Prozhu/p/5452628.html
Copyright © 2020-2023  润新知