上传文件
核心是使用file.transferTo()
方法将上传文件写入到指定路径的文件中
- 通过
MultipartFile
类对象来接收前端传递的文件,通过getOriginalFilename()
来获取上传文件名(文件名+后缀) - 将文件名与父目录拼接成全路径
- 判断全路径中父目录是否存在(常用
file.getParentFile().Exist()
或hutool
包下FileUtil.exist()
判断),不存在则创建父目录 - 判断该文件是否已存在,若已存在则重新指定文件名
- 使用
transferTo()
方法将文件进行存储
下载文件
核心是用HttpServletResponse
类对象的输出流将读取的bytes
数组进行输出
- 根据传入文件名拼接文件存储的全路径
- 判断全路径下是否有该文件,没有则返回
- 通过
hutool
包下FileUtil.readBytes(fullPath)
来读取文件并返回bytes
数组 - 获取
HttpServletResponse
类对象并使用其输出流write()
方法将bytes
数组
@RestController
@RequestMapping("/file")
public class TestFileController {
public static final String ROOT_PATH = System.getProperty("user.dir") + File.separator + "files";
@Value("ip: localhost")
private String ip;
@Value("port: 8080")
private Integer port;
@PostMapping("/upload") // 上传文件
public Result upload(MultipartFile file) throws IOException {
String originalFilename = file.getOriginalFilename(); // aaa.jpg
// String mainName = FileUtil.mainName(originalFilename); aaa 文件名
// String ext = FileUtil.extName(originalFilename); jpg 文件后缀
String fullPath = ROOT_PATH + File.separator + originalFilename;
if (!FileUtil.exist(ROOT_PATH)){
FileUtil.mkdir(ROOT_PATH); // 父目录不存在则创建
}
if (FileUtil.exist(fullPath)){
fullPath = ROOT_PATH + File.separator + System.currentTimeMillis() + originalFilename; // 文件重复则重新指定文件名
}
file.transferTo(new File(fullPath)); // 存储文件到本地
String downloadUrl = "http://" + ip + ":" + port + "/file/download" + originalFilename;
return new Result().success().data("download_url", downloadUrl);
}
@GetMapping("/download/{fileName}") // 下载文件
public void download(@PathVariable("fileName") String fileName, HttpServletResponse response)
throws IOException {
String fullPath = ROOT_PATH + File.separator + fileName;
OutputStream outputStream = response.getOutputStream(); // 获取输出流
outputStream = new BufferedOutputStream(outputStream); // 创建缓冲输出流
if (!FileUtil.exist(fullPath)){
return;
}
byte[] bytes = FileUtil.readBytes(fullPath); // 读取文件
outputStream.write(bytes); // 输出文件;
outputStream.flush();
outputStream.close();
}
}