业务场景:因为公司会对excel文档加密,通过svn或者git上传代码也会对文档进行加密,所以这里将文档后缀去了,这样避免文档加密。
实现思路:将文档去掉后缀,放入resources下,获取输入流,最后加上后缀,前端成功下载
效果图
上代码
package com.***.util;
import cn.hutool.core.util.StrUtil;
import org.springframework.core.io.ClassPathResource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
/**
* @author longwei
* @Description excel帮助类
* @date 2023/8/30 14:36
*/
public class ExcelUtils {
/**
* 从静态资源下载文件
*
* @param fileName 文件名,没有后缀
* @param suffix 文件后缀
* @param request request
* @param response response
*/
public static void downloadFileByLocalPath(HttpServletRequest request, HttpServletResponse response,
String fileName, String suffix) throws Exception {
if (StrUtil.isEmpty(fileName) || StrUtil.isEmpty(suffix)) {
throw new RuntimeException("文件信息不能为空");
}
InputStream inputStream = new ClassPathResource("file" + File.separator + fileName).getInputStream();
fileName = fileName + suffix;
downFileByInputStream(request, response, inputStream, fileName);
}
public static void downFileByInputStream(HttpServletRequest request, HttpServletResponse response, InputStream inputStream, String fileName) throws Exception {
byte[] buffer = new byte[1024];
BufferedInputStream bis = null;
OutputStream os = null;
String finalFileName;
try {
final String userAgent = request.getHeader("USER-AGENT");
//IE浏览器
if (StrUtil.contains(userAgent, "MSIE") || StrUtil.contains(userAgent, "Trident")) {
finalFileName = URLEncoder.encode(fileName, "UTF8");
}
//google,火狐浏览器
else if (StrUtil.contains(userAgent, "Mozilla")) {
finalFileName = new String(fileName.getBytes(), "ISO8859-1");
}
//其他浏览器
else {
finalFileName = URLEncoder.encode(fileName, "UTF8");
}
response.setCharacterEncoding("UTF-8");
// 设置强制下载不打开
response.setContentType("application/force-download");
// 设置文件名
response.addHeader("Content-Disposition", "attachment;fileName=" + finalFileName);
bis = new BufferedInputStream(inputStream);
os = response.getOutputStream();
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (bis != null) {
try {
bis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (os != null) {
try {
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
controller层
@RequestMapping("/downloadTemplate")
public void downloadTemplate(HttpServletRequest request, HttpServletResponse response) {
breedInfoService.downloadTemplate(request, response);
}
service.impl层,这里直接用ExcelUtils方法
@Override
public void downloadTemplate(HttpServletRequest request, HttpServletResponse response) {
String fileName = "中药饮片导入模板";
try {
ExcelUtils.downloadFileByLocalPath(request, response, fileName, ".xlsx");
} catch (Exception e) {
log.error("下载中药饮片导入模板失败-{}", e.getMessage());
throw new BusinessException("下载中药饮片导入模板失败,请联系管理员!");
}
}