前端代码
index.js文件
export function DownloadFile(param){
return Axios({
url: #url,
method: "post",
responseType: "blob",
data: param
})
}
test.vue文件
<template>
<el-button @click="downloadFile" >下载文件</el-button>
</template>
<script>
import { DownloadFile } from "../test/index"
export default{
methods: {
downloadFile(){
var data = {}
DownloadFile(data).then( res => {
const url = window.URL.createObjectURL(res)
const a = document.createElement("a");
a.href = url;
a.download = 'text.txt';
// 将 a 标签添加到 DOM 中,并模拟点击,触发浏览器的下载功能
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
})
}
}
}
</script>
后端
Controller层
@ApiOperation("下载文件")
@PostMapping("/downloadFile")
public void downloadFile(HttpServletRequest request,
HttpServletResponse response){
File file = new File("XXX");
//使用封装下载方法下载文件
DownloadFileUtil.downloadFile("text.txt",file,response,request);
}
DownloadFileUtil文件下载工具类
import org.apache.commons.lang3.StringUtils;
import sun.misc.BASE64Encoder;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
public class DownloadFileUtil {
/**
* 下载文件
* @param originalFileName :下载文件的原始文件名
* @param file :下载的文件
* @param response :相应对象
*/
public static void downloadFile(String originalFileName, File file, HttpServletResponse response, HttpServletRequest request) {
// 数据校验
checkParam(originalFileName,file);
//相应头的处理
//清空response中的输出流
response.reset();
//设置文件大小
response.setContentLength((int) file.length());
//设置Content-Type头
response.setContentType("application/octet-stream;charset=UTF-8");
//设置Content-Disposition头 以附件形式解析
String encodedFilename = getEncodedFilename(request, originalFileName);
// 解决下载时出现的跨域问题
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "POST");
response.addHeader("Access-Control-Allow-Headers", "Content-Type");
response.setHeader("Content-Disposition", "attachment;filename=" + encodedFilename);
//将来文件流写入response中
FileInputStream fileInputStream = null;
ServletOutputStream outputStream = null;
try {
//获取文件输入流
fileInputStream = new FileInputStream(file);
//创建数据缓冲区
byte[] buffers = new byte[1024];
//通过response中获取ServletOutputStream输出流
outputStream = response.getOutputStream();
int length;
while ((length = fileInputStream.read(buffers)) > 0) {
//写入到输出流中
outputStream.write(buffers, 0, length);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//流的关闭
if(fileInputStream != null){
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outputStream != null) {
try {
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 下载文件的参数的校验,如果参数不合法则抛出自定义异常
* @param originalFileName :文件原始文件名
* @param file :待下载的文件
*/
private static void checkParam(String originalFileName, File file) {
if(StringUtils.isBlank(originalFileName)){
throw new DownloadException("输入的文件原始文件名为空");
}
if(file == null || !file.exists() ){
throw new DownloadException("待在下载的文件不存在!");
}
}
/**
* 获取URL编码后的原始文件名
* @param request :客户端请求
* @param originalFileName :原始文件名
* @return :
*/
private static String getEncodedFilename(HttpServletRequest request, String originalFileName) {
String encodedFilename = null;
String agent = request.getHeader("User-Agent");
if(agent.contains("MSIE")){
//IE浏览器
try {
encodedFilename = URLEncoder.encode(originalFileName, "utf-8");
encodedFilename = encodedFilename.replace("+", " ");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}else if(agent.contains("Firefox")){
//火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
encodedFilename = "=?utf-8?B?" + base64Encoder.encode(originalFileName.getBytes(StandardCharsets.UTF_8))+"?=";
}else{
//其他浏览器
try {
encodedFilename = URLEncoder.encode(originalFileName, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return encodedFilename;
}
}
下载异常工具类
public class DownloadException extends RuntimeException{
public DownloadException(String origin){
super("{"+origin+"}发生了异常:");
}
public DownloadException(String origin,Exception ex){
super("{"+origin+"}发生了异常:"+parseErrMsg(ex));
}
private static String parseErrMsg(Exception ex) {
if(ex == null){
return "异常堆栈获为空";
}
String errMsg = "";
StackTraceElement[] stackTrace = ex.getStackTrace();
for (StackTraceElement s : stackTrace) {
errMsg+="\tat " + s + "\r\n";
}
return errMsg;
}
}