package com.lic.fussel.foundation.filecabinets.util;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
/**
* 类名:DownLoadUtils
* 描述:TODO
* 作者:Cruise
* 日期:2020/3/27 下午1:40
* 版本:1.0
**/
public class DownLoadUtils {
public static DownLoadUtils me;
private DownLoadUtils(){
//单例
}
//双重锁
public static DownLoadUtils getInstance(){
if (me==null) {
synchronized (EncrypeUtil.class) {
if(me == null){
me = new DownLoadUtils();
}
}
}
return me;
}
/**
* 以流的方式下载
* @param path
* @param response
* @return
*/
public static HttpServletResponse download(String path,String filename ,HttpServletRequest request, HttpServletResponse response) {
try {
FileEncryptUtil.decrypt(path);// 解密
// path是指欲下载的文件的路径。
File file = new File(path);
// 以流的形式下载文件。
InputStream fis = new BufferedInputStream(new FileInputStream(path));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
setFileDownloadHeader(request,response,filename);
response.addHeader("Content-Length", "" + file.length());
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
FileEncryptUtil.encrypt(path);
} catch (IOException ex) {
ex.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
public static void setFileDownloadHeader(HttpServletRequest request, HttpServletResponse response, String fileName) {
String userAgent = request.getHeader("USER-AGENT");
try {
String finalFileName = null;
if (userAgent.contains("MSIE")) {// IE浏览器
finalFileName = URLEncoder.encode(fileName, "UTF8");
} else if (userAgent.contains("Mozilla")) {// google,火狐浏览器
finalFileName = new String(fileName.getBytes(), "ISO8859-1");
} else {
finalFileName = URLEncoder.encode(fileName, "UTF8");// 其他浏览器
}
response.addHeader("Content-Disposition", "attachment; filename="" + finalFileName + """);// 这里设置一下让浏览器弹出下载提示框,而不是直接在浏览器中打开
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}