浏览器点击超链接后实现文件下载

package cn.iecast.servlet;

import sun.misc.BASE64Encoder;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;

@WebServlet("/downloadServlet")
/**
@Author:Chen
@Description:
@Date:10:42 2019/6/1
**/
public class downLoadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        1.huoqu文件名称
        String fileName=request.getParameter("fileName");
//        2.加载进内存
        ServletContext servletContext=this.getServletContext();
        String agent=request.getHeader("user-agent");
//根据浏览器,确定fileName为中文时的编码方式
        fileName=getFileName(agent,fileName);
        String file=servletContext.getRealPath("/img/"+fileName);
        FileInputStream fis=new FileInputStream(file);
//        3设置response的响应头
//        3.1设置响应头类型
//        MIMEl类型:大类型/小类型
//        eg:text/html   定义成html形式的纯文本
        String mime=servletContext.getMimeType(fileName);//获取MIME值
        response.setContentType(mime);
//       3.2 设置响应头的打开方式,attachment表示附件形式上传,filename的值为浏览器中显示的附件名称
        response.setHeader("content-disposition","attachment;filename="+fileName);
//        4.流的对拷
        ServletOutputStream sr=response.getOutputStream();
        byte[] buff=new byte[1024*8];
        int len=0;

//        从(来源)输入流中(读取内容)读取的一定数量字节数,并将它们存储到(去处)缓冲区数组b中,返回值为实际读取的字节数
//        运行一次读取一定的数量的字节数.java会尽可能的读取b个字节,但也有可能读取少于b的字节数.至少读取一个字节
//        第一个字节存储读入元素b[0],下一个b[1],等等。读取的字节数是最多等于b的长度。
//        如果没有可用的字节,因为已经到达流的末尾, -1返回的值
//        如果b.length==0,则返回0
        while((len=fis.read(buff))!=-1){
            sr.write(buff,0,len);
        }
        fis.close();
    }
//工具类,根据浏览器版本,实现中文显示
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
    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;
    }
}

你可能感兴趣的:(javaweb,javaweb)