文件下载

@WebServlet(urlPatterns = "/download")
public class DownServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 获取要下载的文件名称
        String fileName = req.getParameter("fileName");
        System.out.println(fileName);

        // 加载当前文件
        // 动态获取
        ServletContext context = getServletContext();
        String realPath = context.getRealPath("/download");
        // realPath = D:\work\ideawork\web02\out\artifacts\day09_war_exploded\download
        // fileName = 1.jpg 2.jpg ...
        File file = new File(realPath, fileName);

        // 要下载的这个文件的类型
        // 响应消息头设置:Content-Type 设文件媒体格式
        // getMineType:1.txt 2.jpg 获取文件后缀名 以这种形式 image/jpeg text/plain
        // resp.setContentType(getServletContext().getMimeType(fileName));
        resp.setHeader("Content-Type", getServletContext().getMimeType(fileName));

        // 处理中文乱码 使用第一个工具类
        fileName = DownloadUtils.getName(req.getHeader("user-agent"), fileName);

        // Content‐Disposition 设置要被下载的文件名
        //告诉客户端该文件不是直接解析 而是以附件形式打开(下载)
        resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);

        // 使用IO向浏览器输出
        FileInputStream in = new FileInputStream(file);
        ServletOutputStream out = resp.getOutputStream();

        // 如果使用另外一个防止中文乱码工具类 要把这句话写在这个位置
        //  MyDownLoadUtils.setConentType(req, fileName, resp);

        /* 标准IO流
        byte[] b = new byte[1024];
        int len;
        while ((len = in.read(b)) != -1) {
            out.write(b, 0, len);
        }
        in.close();*/
        // 使用io工具类 需要导入commons-io-1.4.jar包
        IOUtils.copy(in, out);
        IOUtils.closeQuietly(in);

    }

中文乱码工具类一

import sun.misc.BASE64Encoder;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
/*
 * 根据浏览器的内核,对下载的文件名称进行处理 火狐浏览器使用base64编码 其他都使用url编码
 */
public class DownloadUtils {
    public static String getName(String agent, String filename) throws
            UnsupportedEncodingException {
        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;
    }
}
中文乱码工具类二

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sun.misc.BASE64Encoder;

public class MyDownLoadUtils {
 public static String base64EncodeFileName(String fileName) {
  BASE64Encoder base64Encoder = new BASE64Encoder();
  try {
   return "=?UTF-8?B?"
     + new String(base64Encoder.encode(fileName
       .getBytes("UTF-8"))) + "?=";
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
   throw new RuntimeException(e);
  }
 }
 
 public static void setConentType(HttpServletRequest request,String fileName,HttpServletResponse response) throws UnsupportedEncodingException{
  //获取User-Agent请求头: 携带客户端操作系统以及浏览器信息
  String agent=request.getHeader("User-Agent");
  if(agent.contains("Firefox")){
   fileName=MyDownLoadUtils.base64EncodeFileName(fileName);
  }else{
   fileName=URLEncoder.encode(fileName,"utf-8");
  }
  //注意转码后看到的还是乱码,这个乱码浏览器可以正常识别
  System.out.println("XXXX:"+fileName);
  response.setHeader("Content-disposition", "attachment;filename="+fileName);
 }
}

解决IE浏览器地址栏中文乱码问题:

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<script>
    function isIE() {
        //获取当前浏览器相关信息
        var explorer = window.navigator.userAgent.toLowerCase();
        //判断是否是ie浏览器
        if (explorer.indexOf("msie") >= 0 || explorer.indexOf("rv:11.0) like gecko") >=
            0) {
            return true;
        } else {
            return false;
        }
    }

    window.onload = function () {
        if (isIE()) {
            //在是IE浏览器的情况下,对中文请求参数编码
            var str = document.getElementById("ww").href;
            var str = encodeURI(str);
            document.getElementById("ww").href = str;
        }
    };
</script>
</head>
<body>
<a href="/day09/download?fileName=1.jpg">1.jpg</a>
<a href="/day09/downloads?fileName=3.txt">3.txt</a>
<a id="ww" href="/day09/download?fileName=你好.txt">你好.txt</a>
</body>
</html>
Last modification:July 29th, 2019 at 05:43 pm