文件上传和下载
环境
**SpringBoot: ** 2.5.14
**Vue3: ** ^3.2.47
**element-plus: ** ^2.3.4,
**axios: **^1.4.0,
代码
后端
@PostMapping("/upload")
public R uploadFile(@RequestParam(value = "file") MultipartFile[] files,
@Value("${file.server.resource-location}") String filePath) {
// 这里允许上传多个文件
for (MultipartFile file: files) {
// 首先判断文件是否存在
if (file == null || file.isEmpty()) {
continue;
}
try {
// 本地文件保存位置
File uploadDir = new File(filePath);
if (!uploadDir.exists()) {
uploadDir.mkdir();
}
log.info(uploadDir.getAbsolutePath());
String fileName = file.getOriginalFilename();
if (fileName != null) {
// uuid 文件名工具类方法
String uniqueFileName = ProposalUtil.getUniqueFileID(fileName);
String fileFullPath = uploadDir.getAbsolutePath() + File.separator + uniqueFileName;
File localFile = new File(fileFullPath);
// transfer to local
file.transferTo(localFile);
}
} catch (Exception e) {
log.error("文件上传失败:" + file.getOriginalFilename());
}
}
// R为后端返回值封装类
return R.ok();
}
@GetMapping("/download")
public void downloadFile(@RequestParam(value = "file") String fileName,
@Value("${file.server.resource-location}") String filePath,
HttpServletResponse response) throws IOException {
response.reset();
response.setContentType("application/octet-stream");
String encoded = URLEncoder.encode(fileName, "UTF-8");
// 解决中文文件名乱码问题,必须要对文件名进行utf-8编码
response.setHeader("Content-disposition",
"attachment;filename=" + encoded + ";filename*=UTF-8" + encoded);
// 这里使用原生response会失去Springboot的config,需要手动配置一下跨域
response.setHeader("Access-Control-Allow-Origin", "*");
// 从文件读到servlet response输出流中
File fileDir = new File(filePath);
// 默认文件名是带扩展名的!!!
File file = new File(fileDir.getAbsoluteFile() + File.separator + fileName);
try (FileInputStream inputStream = new FileInputStream(file)) {
byte[] b = new byte[1024];
int len;
while ((len = inputStream.read(b)) > 0) {
response.getOutputStream().write(b, 0, len);
}
log.info("File downloaded successfully: " + fileDir.getAbsoluteFile() + File.separator + fileName );
} catch (IOException e) {
if (e instanceof FileNotFoundException) {
// 设置返回值为500
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
log.error("File not found: " + fileDir.getAbsoluteFile() + File.separator + fileName );
}
}
}
前端
部分样式可能不合理可以自行调正
上传
下载
最后更新于
这有帮助吗?