核心代码如下:
Java 文件下载工具类
/**
* 下载文件
* @param response HttpServletResponse
* @param fileName 下载的文件名 (可以与原始文件名不一样)
* @param file 下载的文件
*/
public static void download(HttpServletResponse response, String fileName, File file) {
try {
String title = URLEncoder.encode(fileName, "UTF-8");
response.reset();
response.setContentType("application/octet-stream");
response.setCharacterEncoding("utf-8");
response.setContentLength((int) file.length());
response.setHeader("Content-Disposition", "attachment;filename=" + title + ";" + "filename*=utf-8''" + title);
// 放行Content-disposition响应头
response.setHeader("Access-Control-Expose-Headers", "Content-disposition");
response.setHeader("Access-Control-Allow-Origin", "*");
} catch (UnsupportedEncodingException e) {
log.error(e.getMessage());
}
OutputStream os = null;
try (BufferedInputStream bis = new BufferedInputStream(Files.newInputStream(file.toPath()))) {
os = response.getOutputStream();
byte[] buff = new byte[1024];
int i = 0;
while ((i = bis.read(buff)) > 0) {
os.write(buff, 0, i);
}
os.flush();
} catch (IOException e) {
log.error(e.getMessage());
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
log.error(e.getMessage());
}
}
}
}
调用:
FileUtil.download(response, fileName, file);
@GetMapping("/download")
public void download(HttpServletResponse response, @RequestParam String fileId) {
fileManageService.download(response, fileId);
}
前端处理:
/**
* 下载文件
* 示例: http://localhost:8080/download?fileId=20250613113436
* @param {} url
*/
export function downloadFile(url) {
axios.get(url, {
responseType: 'blob',
}).then(res => {
let contentDisposition = res.headers['content-disposition'];
const patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
const result = patt.exec(contentDisposition)
const filename = decodeURI(result[1]) // 处理文件名,解决中文乱码问题
let blob = new Blob([res.data], {type: 'application/octet-stream'});
let url = window.URL.createObjectURL(blob);
let a = document.createElement('a');
a.href = url;
a.download = filename;
a.click();
window.URL.revokeObjectURL(url);
})
}