文件路径配置在配置文件中,可根据需求进行文件路径的修改,直接调用接口就可以直接下载相应路径下的文件:
@Value("${filepath}")
private String filepath; //文件路径
@ApiOperation("文件下载")
@GetMapping("/download")
@ResponseBody
public void download(HttpServletResponse response) {
log.info("文件下载:{}", filepath);
File file = new File(filepath);
if (!file.exists()) {
log.error("文件不存在:{}", filepath);
return;
}
try {
// 正确获取文件名(只获取文件名部分,不包含路径)
String fileName = file.getName();
// 如果需要去掉扩展名,可以使用:
// String fileNameNoEx = FileUtil.getFileNameNoEx(fileName);
log.info("文件名:{}", fileName);
// 设置响应头
response.reset();
response.setCharacterEncoding("UTF-8");
// 只设置一个Content-Type
response.setContentType("application/octet-stream");
response.setHeader("Accept-Ranges", "bytes");
// 正确处理文件名编码
String encodedFileName = URLEncoder.encode(fileName, "UTF-8");
// 处理空格编码问题
encodedFileName = encodedFileName.replaceAll("\\+", "%20");
// 设置Content-Disposition头
response.setHeader("Content-Disposition", "attachment;filename=\"" + encodedFileName + "\"");
// 使用缓冲流提高性能
try (InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
OutputStream outputStream = new BufferedOutputStream(response.getOutputStream())) {
// 使用缓冲区复制文件,避免一次性读取整个文件到内存
byte[] buffer = new byte[4096]; // 4KB缓冲区
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
}
// 如果需要删除文件
if (delete != null && delete) {
file.delete();
log.info("文件已删除:{}", filepath);
}
} catch (IOException e) {
log.error("文件下载失败", e);
}
}