前端点击下载,传入相关信息进入java后台,后台根据信息查询到文件路径,再使用io流去读取文件,存入输出流并返回。
/**
* 下载申请材料
* 根据获取的文件实体返回输出流
* @param response 响应
* @param memberFile 文件实体
* @return 返回输出流
*/
public static OutputStream downLoadFile(HttpServletResponse response, MemberFile memberFile){
// 文件名
String fileName = memberFile.getName();
if (fileName != null) {
//设置文件路径
File file = new File(memberFile.getPath());
if (file.exists()) {
byte[] buffer = new byte[1024];
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
return os;
} catch (Exception e) {
e.printStackTrace();
logger.error("下载失败");
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}return null;
}
前端接收输出流,需要先设置返回格式为blob,然后再进入保存
this.$axios
.post("/template/downloadTemplate", JSON.stringify(row), {
responseType: "blob",
})
.then((res) => {
const content = res.data;
const blob = new Blob([content]);
const fileName = row.name + "." + row.suffixal;
if ("download" in document.createElement("a")) {
const elink = document.createElement("a");
elink.download = fileName;
elink.style.display = "none";
elink.href = URL.createObjectURL(blob);
document.body.appendChild(elink);
elink.click();
URL.revokeObjectURL(elink.href);
document.body.removeChild(elink);
}
});
},