JavaWeb_15_03_req_resp_ServletContext_文件下载案例

1 文件下载需求

  • 页面显示超链接
  • 店家超链接,弹出下载提示框
  • 完成图片文件下载

2 需求解析

  • 1、超链接执行的资源如果能够被浏览解析,则在浏览器中显示,如果不能解析,就弹出下载提示框,不满足需求
  • 2、任何资源都必须弹出下载提示框
  • 3、使用响应头设置资源的打开方式
    • 设置如下响应头,文件都会弹框提示是否下载,会以附件的形式弹出
    • content-disposition:attachment;filename=文件名称

3 步骤

  • 1、定义页面,编辑超链接href属性,只想servlet,传递资源名称filename
  • 2、定义servlet:
    • 获取文件名称,
    • 加载文件进内存(字节输入流),需要找到文件的真实路径
    • 指定response的响应头:content-disposition:attachment;filename=文件名称
    • 将文件写到response响应的输出流中

4 中文文件名的问题

获取客户端使用浏览器的版本信息
根据不同的版本信息,设置filename的编码方式

5 代码

5.1 编写download.html文件


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>
    <h3>浏览器直接解析图片或视屏h3>
    <a href="/day15/img/1.jpg">图片a>
    <a href="/day15/img/1.mp4">视频a>
    <hr>

    <h3>弹框确认以附件的形式下载h3>
    <a href="/day15/downLoadServlet?filename=1.jpg">图片a>
    <a href="/day15/downLoadServlet?filename=金克斯.jpg">图片a>
    <a href="/day15/downLoadServlet?filename=1.mp4">视频a>

body>
html>

5.2 创建img目录-添加图片视频

JavaWeb_15_03_req_resp_ServletContext_文件下载案例_第1张图片

5.3 编写工具类DownLoadUtils—处理中文文件名乱码

package com.zzy.utils;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class DownLoadUtils {
     
    public static String getFilename(String agent,String filename) throws UnsupportedEncodingException {
     
        if(agent.contains("MSIE")){
     
            //IE浏览器
            filename = URLEncoder.encode(filename, "utf-8");
            filename = filename.replace("+", " ");
        }else if(agent.contains("FireFox")){
     
            //火狐浏览器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filename = "=?utf-8?B?"+base64Encoder.encode(filename.getBytes("utf-8"))+"?=";
        }else {
     
            //其他浏览器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        return filename;
    }
}

5.4 创建DownLoadServlet

package com.zzy.download;

import com.zzy.utils.DownLoadUtils;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * 文件下载
 */
@WebServlet("/downLoadServlet")
public class DownLoadServlet extends HttpServlet {
     
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
        //1 获取文件名称filename
        String filename = request.getParameter("filename");

        //2、使用字节输入流读取进去内存
        //2.1 找到文件的服务器真实路径
        ServletContext context = request.getServletContext();
        String realPath = context.getRealPath("/img/" + filename);
        //2.3 勇字节流关联
        FileInputStream fis = new FileInputStream(realPath);

        //3、设置response的响应头
        //3.1 设置响应头类型:content-type
        String mimeType = context.getMimeType(filename);//获取文件的MIME类型
        response.setHeader("content-type",mimeType);

        //3.2 解决中文文件名乱码问题
        //获取user-agent请求头信息
        String agent = request.getHeader("user-agent");
        //使用工具类方法编码文件名即可
        filename = DownLoadUtils.getFilename(agent, filename);

        //3.3 设置响应头打开方式:content-disposition
        response.setHeader("content-disposition","attachment;filename="+filename);

        //4、将输入流的数据写出到response的输出流中
        ServletOutputStream sos = response.getOutputStream();
        //定义字节数组缓存区
        byte[] buff = new byte[1024*8];
        int len = 0;
        while ((len = fis.read(buff))!=-1){
     
            //输出流往出写数据
            sos.write(buff, 0, len);
        }

        //5、关闭资源
        fis.close();

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
        this.doPost(request, response);
    }
}

5.5 访问路径

http://localhost:8080/day15/download.html

JavaWeb_15_03_req_resp_ServletContext_文件下载案例_第2张图片

5.6 输出结果

  • 1 不弹框展示数据

直接展示图片

直接展示视频

  • 2、弹框显示下载查看

图片弹框提示下载
JavaWeb_15_03_req_resp_ServletContext_文件下载案例_第3张图片

视频弹框提示下载
JavaWeb_15_03_req_resp_ServletContext_文件下载案例_第4张图片

中文文件名称不乱码提示下载
JavaWeb_15_03_req_resp_ServletContext_文件下载案例_第5张图片

你可能感兴趣的:(JavaWeb)