文件的上传和下载

  1. 1. 文件的上传和下载
    1. 1.1. 文件的上传介绍
    2. 1.2. 上传http协议内容介绍
  2. 2. 文件下载
  3. 3. base64编解码操作

文件的上传和下载

文件的上传和下载时非常常见的功能,很多相同中,或者软件中经常使用文件的上传和下载
比如qq头像,就使用了上传
oa相同中附件材料的是个脑残

文件的上传介绍

  1. 要有一个form标签 method=post请求
  2. form标签的encType属性值必须为multipart/form-date值
  3. 在form标签中使用input type=file添加要上传的文件
  4. 编写服务器代码接受,处理上传的数据

    上传http协议内容介绍

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("文件上传过来了");
    System.out.println(req.getParameter("username"));
    System.out.println(req.getParameter("photo"));
    ServletInputStream inputStream = req.getInputStream();
    byte[] buffer = new byte[102400];
    int read = inputStream.read(buffer);
    System.out.println(new String(buffer,0,read));

    chrome并不能得到请求体,在java后台查看
    commons-fileupload.jar 需要依赖 commons-io.jar 这个包,所以两个包我们都要引入。
    第一步,就是需要导入两个 jar 包:
    commons-fileupload-1.2.1.jar commons-io-1.4.jar commons-fileupload.jar 和 commons-io.jar 包中,我们常用的类有哪些?
    ServletFileUpload 类,用于解析上传的数据。 FileItem 类,表示每一个表单项。
    boolean ServletFileUpload.isMultipartContent(HttpServletRequest request);
    判断当前上传的数据格式是否是多段的格式。
    public List<FileItem> parseRequest(HttpServletRequest request) 解析上传的数据
    boolean FileItem.isFormField()
    判断当前这个表单项,是否是普通的表单项。还是上传的文件型。
    true 表示普通类型的表单项 false 表示上传的文件类型 String FileItem.getFieldName() 获取表单项的 name 属性值
    String FileItem.getString() 获取当前表单项的值。
    String FileItem.getName(); 获取上传的文件名 void FileItem.write( file ); 将上传的文件写到 参数 file 所指向抽硬盘位置 。

    文件下载

    客户端浏览器发送给服务器要下载什么文件
    读取要下载文件的内容
    把下载的文件内容回传给客户端告诉客户端返回数据类型利用响应头
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    package com.atguigu.servlet;
    import org.apache.commons.io.IOUtils;
    import sun.nio.ch.IOUtil;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.URLEncoder;
    public class DownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //1.获取要下载的文件名
    String downloadFileName = "background.jpg";
    //2.读取要下载的文件内容(通过servletcontext对象可以读取)
    ServletContext servletContext = getServletContext();
    //3.获取要下载的文件
    String mimeType = servletContext.getMimeType("/img/" + downloadFileName);
    System.out.println("下载的文件类型;"+mimeType);
    //4.在回传前,通过响应头告诉客户端返回的数据类型
    resp.setContentType(mimeType);
    //5.还要告诉告诉客户端收到的数据是否用于下载(还是用于响应头)
    //attachment表示附件,表示下载使用
    resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode("中国.jpg","UTF-8"));//文件名设置
    //url编码是把汉字转换成%xx%xx的格式
    /**
    * 斜杠映射到服务器web目录
    */
    InputStream resourceAsStream = servletContext.getResourceAsStream("/img/" + downloadFileName);
    //获取响应的输出流
    OutputStream outputStream =resp.getOutputStream();
    //读取输入流中的全部数据,复制该输出流,输出给客户端
    IOUtils.copy(resourceAsStream,outputStream);
    }
    }
    谷歌浏览器见上
    火狐浏览器

    base64编解码操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    package com.atguigu.servlet;

    import org.apache.commons.io.IOUtils;
    import sun.misc.BASE64Encoder;
    import sun.nio.ch.IOUtil;

    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.URLEncoder;

    public class DownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //1.获取要下载的文件名
    String downloadFileName = "background.jpg";
    //2.读取要下载的文件内容(通过servletcontext对象可以读取)
    ServletContext servletContext = getServletContext();
    //3.获取要下载的文件
    String mimeType = servletContext.getMimeType("/img/" + downloadFileName);
    System.out.println("下载的文件类型;" + mimeType);
    //4.在回传前,通过响应头告诉客户端返回的数据类型
    resp.setContentType(mimeType);
    //5.还要告诉告诉客户端收到的数据是否用于下载(还是用于响应头)
    //attachment表示附件,表示下载使用
    String ua = req.getHeader("User-Agent");
    // 判断是否是火狐浏览器
    if (ua.contains("Firefox")) {
    // 使用下面的格式进行 BASE64 编码后
    String str = "attachment; fileName=" + "=?utf-8?B?" + new BASE64Encoder().encode("中文.jpg".getBytes("utf-8")) + "?="; // 设置到响应头中
    resp.setHeader("Content-Disposition", str);
    } else {
    // 把中文名进行 UTF-8 编码操作。
    String str = "attachment; fileName=" + URLEncoder.encode("中文.jpg", "UTF-8");
    // 然后把编码后的字符串设置到响应头中
    resp.setHeader("Content-Disposition", str);
    }


    /**
    * 斜杠映射到服务器web目录
    */

    InputStream resourceAsStream = servletContext.getResourceAsStream("/img/" + downloadFileName);
    //获取响应的输出流
    OutputStream outputStream = resp.getOutputStream();
    //读取输入流中的全部数据,复制该输出流,输出给客户端
    IOUtils.copy(resourceAsStream, outputStream);
    }
    }