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

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"%>




Insert title here


    

文件上传

文件信息:
用户名:
文件:
文件2:

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 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 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 文件上传概述及其入门案例)