环境
- JDK 1.8
- SpringBoot 2.x
一、文件上传
/*
* 文件上传
* @param multipartFile
* @return Result
*/
@ApiOperation("文件上传")
@PostMapping("/file/upload")
@SneakyThrows
public Result file(AdapterRequestWrapper request,
@RequestParam("ferryFile") MultipartFile multipartFile) {
// 文件大小
double fileSize = multipartFile .getSize() / 1000.0 / 1024.0;
log.warn("当前上传文件大小:" + (fileSize / 1000 / 1024) + "M");
// 原始文件名
String originalFilename = multipartFile .getOriginalFilename();
assert originalFilename != null;
// 文件存储路径
// File.separator 不同操作系统的文件分隔符
String storePath = "E:" + File.separator + "study"+ originalFilename;
// 上传文件
File storeFile = FileUtil.getFile(storePath, originalFilename);
multipartFile .transferTo(storeFile);
return ResultGenerator.genOkResult("文件上传成功");
}
二、下载
1.注意事项
下载时文件名需要特殊处理:去除空格、防止特殊符号截断、不同浏览器编码处理
2.实现
/*
*
* @param filePath 完整路径= 存储路径 + 文件名称
*/
@ApiOperation("文件下载")
@ApiImplicitParam(value = "完整路径",name = "filePath")
@GetMapping("/file/download")
public ResponseEntity<Resource> file(HttpServletRequest request,
HttpServletResponse response,
@RequestParam(value = "filePath") String filePath) {
response.setContentType("multipart/form-data");
String fileName = null;
// 去除空格
filePath = filePath.trim();
// 解决文件名乱码问题
if(request.getHeader("User-Agent").toUpperCase().indexOf("MSIE")>0){// 火狐浏览器处理
fileName = URLEncoder.encode(FileUtil.getFileName(filePath), "UTF-8");
}else{
fileName = new String((FileUtil.getFileName(filePath)).getBytes("UTF-8"),"ISO8859-1");
}
response.addHeader("Content-Disposition", "attachment;filename=" +fileName);
byte[] data = null;
try {
FileInputStream input = new FileInputStream(new File(filePath));
data = new byte[input.available()];
int readIndex = input.read(data);
response.getOutputStream().write(data);
input.close();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
三、工具类
import java.io.File;
public final class FileUtil {
/*
* 获取文件,没有则创建
* @param storePath
* @param fileName
* @return File
*/
public static File getFile(String storePath, String fileName) {
File file = new File(storePath, fileName);
if (!file.getParentFile().exists()) {
boolean mkdirs = file.getParentFile().mkdirs();
}
return file;
}
/*
* 获取文件名
* @param filePath
* @return String
*/
public static String getFileName(String filePath){
return filePath.substring(filePath.lastIndexOf(".") + 1);
}
}
四、简写备忘
response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(StandardCharsets.UTF_8),"ISO8859-1"));