美文网首页
Web 基础26 文件上传概述及其入门案例

Web 基础26 文件上传概述及其入门案例

作者: 小熊先生很不开心 | 来源:发表于2018-04-05 13:48 被阅读11次

    1.1 文件上传概述

    • 文件上传
      • 用户将本地文件通过网络上传至服务器的过程
    • 应用场景
      • 相亲网站的照片上传
      • 招聘网站的简历上传
    • 文件上传的技术
    名称 描述
    jspSmartUpload 应用在jsp上的文件上传和文件下载的组件
    fileupload 应用在java上的文件上传技术,由Apache开源组织提供
    servlet3.0 提供了文件上传的技术
    Struts 提供了文件上传的技术
    • 文件上传的条件
      • 需要有一个表单
      • 表单的method属性的值必须设置为post
      • 表单的enctype属性的值需要设置为multipart/form-data
      • 表单需要有一个input标签
        • input标签type属性的值需要设置为file
        • input标签需要有name属性和值

    1.2 JSP编写

    • 一些属性的注释
      • enctype:encode type 编码类型:属性规定了发送服务器之前如何对表单数据进行编码
      • application/x-www-form-urlencoded %WE%RT 默认对表单数据进行url编码,不能用于文件上传
      • multipart/form-data:表单数据有多个部分组成:既有文本数据,还有文件,图片这些二进制数据设置之后,浏览器会将文件以二进制的方式上传,可以实现多种类型的文
        件上传
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <h1>文件上传</h1>
        
        <form action="${pageContext.request.contextPath}/UploadServlet" method="post" enctype="multipart/form-data">
            文件信息:<input type="text" name="info"/>
            <br />
            用户名:<input type="text" name="username"/>
            <br />
            文件:<input type="file" name="file01" />
            <br />
            文件2:<input type="file" name="file02" />
            <br />
            <input type="submit" value="上传"/>
        </form>
    </body>
    </html>
    

    1.3 Servlet的编写

    • 编写流程
      • 创建一个磁盘文件的工厂对象
      • 创建文件上传的核心对象
      • 通过核心对象解析请求对象得到一个集合对象,他里面包含所有的表单项对象
      • 遍历这个集合对象,得到每一个表单项,判断他是否是普通表单项
      • 如果是普通的表单项,获取他的name和value的值
      • 如果不是,创建IO流传输
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //获取表单所提交的数据
            //创建磁盘文件的工厂对象
            DiskFileItemFactory dfif = new DiskFileItemFactory();
            //创建文件上传的核心对象
            ServletFileUpload upload = new ServletFileUpload(dfif);
            //解析请求对象,获取表单所提交的数据
            List<FileItem> items = null;
            try {
                items = upload.parseRequest(request);
            } catch (FileUploadException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            //遍历集合对象
            if(items != null) {
                for (FileItem fileItem : items) {
                    //判断表单项是否是普通的表单项
                    if(fileItem.isFormField()) {
                        //确定是普通的表单项
                        //获取普通表单项name属性的值
                        String fieldName = fileItem.getFieldName();
                        //获取普通表单项value属性的值
                        String fieldValue = fileItem.getString("UTF-8");
                        System.out.println(fieldName + "=" + fieldValue);
                    }
                    else {
                        //文件上传的表单项
                        //获取文件名称
                        String fileName = fileItem.getName();
                        //获取文件的内容
                        InputStream is = fileItem.getInputStream();
                        /*byte[] bys = new byte[1024];
                        int len = 0;
                        while((len = is.read(bys)) != -1) {
                            System.out.println(new String(bys,0,len));
                        }*/
                        
                        String realPath = getServletContext().getRealPath("/file");
                        File file = new File(realPath);
                        if(!file.exists()) {
                            //目录不存在,则要创建
                            file.mkdirs();
                        }
                        //创建输出流对象
                        OutputStream os = new FileOutputStream(realPath + "/" + fileName);
                        byte[] bys = new byte[1024];
                        int len = 0;
                        while((len = is.read(bys)) != -1) {
                            os.write(bys, 0, len);
                        }
                        
                        os.close();
                        
                    }
            
                }
            }
        }
    
    

    1.4 DiskFileItemFactory的常用API

    方法 描述
    void setSizeThreshold(int sizeThreshold) 设置缓冲区大小
    void setRepository(java.io.File repository) 设置临时目录
    DiskFileItemFactory dfif = new DiskFileItemFactory();
    // 设置缓冲区大小
    dfif.setSizeThreshold(1024 * 1024 * 6);// 6M
    // 设置临时目录
    String tempPath = getServletContext().getRealPath("/temp");
    File temp = new File(tempPath);
    if (!temp.exists()) {
        temp.mkdirs();
    }
    
    dfif.setRepository(temp);
    
    
    • 注意:
      • 如果上传的文件不是很大,先走缓冲区
      • 如果上传文件比较大,超过缓冲区的大小,就不走缓冲区了,他会把文件先上传到临时目录中,再把临时目录中的临时文件复制到file目录中
      • 需要把整个文件上传工作完成之后才把临时文件复制到我们指定的File目录中
      • 需要先把Tomcat关掉才能手动删掉temp里面的文件
      • 临时文件临时目录的作用 是做一些续传的操作

    1.5 ServletFileUpload的常用API

    方法 描述
    static boolean isMultipartContent(javax.servlet.http.HttpServletRequest request) 用来判断表单 link-tap的属性值是否是mutipart 是返回ture 否则返回 false
    public void setFileSizeMax(long fileSizeMax) 设置一个请求中单个文件的大小
    public void setSizeMax(long sizeMax) 设置一个请求中所有文件的总大小
    boolean flag = ServletFileUpload.isMultipartContent(request);
    if (!flag) {
        request.setAttribute("msg", "表单提交数据的方式错误!");
        request.getRequestDispatcher("/upload.jsp").forward(request,
                response);
        return;
    }
    
    
    ServletFileUpload upload = new ServletFileUpload(dfif);
    // 设置文件的大小
    upload.setFileSizeMax(1024 * 1024 * 40);//40M
    // 设置请求中所有文件的总大小
    upload.setSizeMax(1024 * 1024 * 40);//40M
    
    • 注意:
      • 工厂对象既可以通过构造方法传递,也可以通过他所对应的set方法传递

    1.7 FileItem的常用API

    方法 描述
    long getSize() 获取表单上传文件的大小
    void delete() 删除临时文件
    void write(java.io.File file) 直接写一个文件

    1.8 上传Servlet 改写

    protected void doGet(HttpServletRequest request,
                HttpServletResponse response) throws ServletException, IOException {
                // 判断表单提交数据的方式是否正确
                boolean flag = ServletFileUpload.isMultipartContent(request);
                if (!flag) {
                    request.setAttribute("msg", "表单提交数据的方式错误!");
                    request.getRequestDispatcher("/upload.jsp").forward(request,
                            response);
                    return;
                }
        
                // 实现文件上传的功能
                DiskFileItemFactory dfif = new DiskFileItemFactory();
                // 设置缓冲区大小
                dfif.setSizeThreshold(1024 * 1024 * 6);// 6M
                // 设置临时目录
                String tempPath = getServletContext().getRealPath("/temp");
                File temp = new File(tempPath);
                if (!temp.exists()) {
                    temp.mkdirs();
                }
        
                dfif.setRepository(temp);
        
                ServletFileUpload upload = new ServletFileUpload(dfif);
                // 设置文件的大小
                // upload.setFileSizeMax(1024 * 1024 * 40);//40M
                // 设置请求中所有文件的总大小
                // upload.setSizeMax(1024 * 1024 * 40);//40M
                List<FileItem> items = null;
                try {
                    items = upload.parseRequest(request);
                } catch (FileUploadException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                if (items != null) {
                    for (FileItem fileItem : items) {
                        if (fileItem.isFormField()) {
                            String fieldName = fileItem.getFieldName();
                            String fieldValue = fileItem.getString("UTF-8");
                            System.out.println(fieldName + "=" + fieldValue);
                        } else {
                            //获取表单上传文件的大小
                            long size = fileItem.getSize();
                            if(size > 0) {
                                String fileName = fileItem.getName();
                                /*InputStream is = fileItem.getInputStream();
                                String realPath = getServletContext().getRealPath("/file");
                                File file = new File(realPath);
                                if (!file.exists()) {
                                    file.mkdirs();
                                }
            
                                OutputStream os = new FileOutputStream(realPath + "/" + fileName);
                                byte[] bys = new byte[1024];
                                int len = 0;
                                while ((len = is.read(bys)) != -1) {
                                    os.write(bys, 0, len);
                                }
                                //关闭输入流,删除临时文件需要
                                is.close();
                                os.close();*/
                                String realPath = getServletContext().getRealPath("/file");
                                File file = new File(realPath);
                                if (!file.exists()) {
                                    file.mkdirs();
                                }
                                //File uploadFile = new File(file,fileName);
                                try {
                                    fileItem.write(new File(file,fileName));
                                } catch (Exception e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
            
                            }
                        }
                        //删除临时文件
                        fileItem.delete();
                    }
        
                }
    
        }
    
    
    
    

    相关文章

      网友评论

          本文标题:Web 基础26 文件上传概述及其入门案例

          本文链接:https://www.haomeiwen.com/subject/tuarhftx.html