文件下载

文件下载

@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>

发表评论