fileupload文件上传用法概述

目录
    1、文件上传表单 和 普通文本表单 的区别
    2、文件上传对页面的要求
    3、文件上传对Servlet的要求
    4、fileupload概述
    5、fileupload简单应用
    6、fileupload上传示例
================================================================
文件上传概述

1、文件上传表单 和 普通文本表单 的区别
    文件上传表单:<form action="" method="post" enctype="multipart/form-data">
        -- 表示多部件表单数据,使用流上传数据。
    普通文本表单:(可以不设置enctype属性)
        -- 当method="get"时,enctype的默认值为null,没有正文,所以就不需要enctype了。
        -- 当method="post"时,enctype的默认值为"application/x-www-form-urlencoded",表示使用url编码正文;

2、文件上传对页面的要求
    1)必须使用表单,而不能是超链接;
    2)表单的method必须是POST,而不能是GET;
    3)表单的enctype属性必须是"multipart/form-data"
    4)在表单中添加file表单字段,即<input type="file" name="xxx"/>
    例如:
    <form action="${pageContext.request.contextPath }/FileUploadServlet" 
  method="post" enctype="multipart/form-data">
        用户名:<input type="text" name="username"/><br/>
        文件1:<input type="file" name="file1"/><br/>
        文件2:<input type="file" name="file2"/><br/>
        <input type="submit" value="提交"/>
    </form>

3、文件上传对Servlet的要求
    表单是文件上传表单时,对Servlet也是有要求的。文件上传表单的数据也是被封装到request对象中的。
    request.getParameter(String)方法获取指定的表单项字符内容,但文件上传表单已不在是字符内容而是字节内容,所以失效。
    使用 ServletInputStream  request.getInputStream()方法获取整个表单内容放到IO流中,它是InputStream接口的子类,
    这个ServletInputStream对象对应整个表单的正文部分(按F12 查看请求信息是从第一个分隔线开始,到最后),
    这说明我们需要的解析流中的数据。
    当然解析它是很麻烦的一件事情,而Apache已经帮我们提供了解析它的工具:commons-fileupload。

  可以尝试把request.getInputStream()这个流中的内容打印出来,再对比httpWatch中的请求数据。
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws Exception {
        InputStream in = request.getInputStream();
        String s = IOUtils.toString(in);
        System.out.println(s);
    }
    Servlet的要求小结:
        (1)方法 request.getParameter() 失效,无法获取表单数据;
        (2)使用 request.getInputStream()得到所有的表单数据,而不是一个表单项的数据;
        (3)这说明如果不使用fileupload,我们就需要自己来对 request.getInputStream() 的内容进行解析!!!

4、fileupload概述
    fileupload是由apache的commons组件提供的上传组件。它最主要的工作就是帮我们解析request.getInputStream()。
    fileupload组件需要的JAR包有:
        commons-fileupload.jar,核心包;
        commons-io.jar,依赖包。
5、fileupload简单应用
    fileupload的核心类有:DiskFileItemFactory、ServletFileUpload、FileItem。
    使用fileupload组件的步骤如下:
    1.创建工厂类DiskFileItemFactory对象:DiskFileItemFactory factory = new DiskFileItemFactory();
    2.使用工厂创建解析器对象:ServletFileUpload fileUpload = new ServletFileUpload(factory);
    3.使用解析器来解析request对象:List<FileItem> list = fileUpload.parseRequest(request);

    隆重介绍FileItem类,它才是我们最终要的结果。一个FileItem对象对应一个表单项(表单字段)。
    一个表单中存在文件字段和普通字段,可以使用FileItem类的isFormField()方法来判断表单字段是否为普通字段,
    如果不是普通字段,那么就是文件字段了。
        * boolean isFormField():判断当前表单字段是否为普通文本字段,true表示普通表单项;false表示文件表单项;
        --------------------
        * String getFieldName():获取字段名称,例如:<input type="text" name="username"/>,返回的是username;
        * String getString():获取字段的内容,如果是文件字段,那么获取的是文件内容,当然上传的文件必须是文本文件;
        --------------------
        * String getName():获取文件字段的文件名称;
        * String getContentType():获取上传的文件的类型,例如:text/plain
        * int getSize():获取上传文件的大小;
        * InputStream getInputStream():获取上传文件对应的输入流;
        * void write(File):把上传的文件保存到指定文件中。
6、fileupload上传示例
    需求:写一个简单的上传示例:
        * 表单包含一个用户名字段,以及一个文件字段;
        * Servlet保存上传的文件到uploads目录,显示用户名,文件名,文件大小,文件类型。
    步骤:
        第一步:
            完成index.jsp,只需要一个表单。注意表单必须是post的,而且enctype必须是mulitpart/form-data的。
            <form action="/FileUploadServlet" method="post" enctype="multipart/form-data">
                用户名:<input type="text" name="username"/><br/>
                文件1:<input type="file" name="file1"/><br/>
                <input type="submit" value="提交"/>
            </form>

        第二步:
            完成 FileUploadServlet
            public void doPost(HttpServletRequest request, HttpServletResponse response) throws Exception {
                request.setCharacterEncoding("utf-8");
                response.setContentType("text/html;charset=utf-8");
                /**
                * 1、创建工厂
                * 2、创建解析器
                * 3、得到文件列表
                */

                // 1、创建工厂
                DiskFileItemFactory dfif = new DiskFileItemFactory();
                //设置缓存大小及目录
                // DiskFileItemFactory dfif = new DiskFileItemFactory(1024*20, new File("F:\\temp"));
                // 2、使用工厂创建解析器对象
                ServletFileUpload fileUpload = new ServletFileUpload(dfif);
                // 3、使用解析器对象解析request,得到FileItem列表
                List<FileItem> list = fileUpload.parseRequest(request);

                for(FileItem fileItem : list) {
                    if(fileItem.isFormField()) {  //判断是否为普通表单项
                        String fieldName = fileItem.getFieldName();// 获取当前表单项的字段名称
                        if(fieldName.equals("username")) {
                            response.getWriter().print("用户名:" + fileItem.getString() + "<br/>");
                        }
                    }else{  //如果当前表单项不是普通表单项,说明就是文件表单项
                        String fileName = fileItem.getName();//获取上传文件的名称
                        // 如果上传的文件名称为空,即没有指定上传文件
                        if(fileName == null || fileName.isEmpty()) {
                            continue;
                        }
                        // 获取真实路径,对应${项目目录}/uploads,当然,这个目录必须存在
                        String savepath = this.getServletContext().getRealPath("/WEB-INF/uploads");
                        // 通过uploads目录和文件名称来创建File对象
                        File file = new File(savepath, fileName);
                        fileItem.write(file); // 把上传文件保存到指定位置
                        response.getWriter().print("上传文件名:" + fileName + "<br/>");
                        response.getWriter().print("上传文件大小:" + fileItem.getSize() + "<br/>");
                        response.getWriter().print("上传文件类型:" + fileItem.getContentType() + "<br/>");
                    }
                }
            }

猜你喜欢

转载自blog.csdn.net/weixin_42472048/article/details/82953846