springboot文件上传与下载
1.文件上传原理
这张图介绍的文件上传的原理,虽然有一些框架有文件上传的组件,但是还是基于这个原理的。
2.代码实现
注意上传文件时,代码的MultiPartFile形参要和表单的name一致,否则为null。
@PostMapping("/upload")
public Result<String> upload(MultipartFile file){
//file是一个临时文件,需要转存到指定位置,否则本次请求完成后临时文件会删除
log.info("上传的文件=>{}",file);
//获取文件原始名称
String originalFilename = file.getOriginalFilename();
//使用UUID重新生成文件名,防止文件名称重复造成文件覆盖
String suffix=originalFilename.substring(originalFilename.lastIndexOf("."));
String filename=UUID.randomUUID().toString()+suffix;
//创建一个目录对象
File dir=new File(baseUrl);
//判断目录是否存在
if(!dir.exists()){
//不存在,则新建一个目录
dir.mkdirs();
}
try {
file.transferTo(new File(baseUrl+filename));
} catch (IOException e) {
e.printStackTrace();
}
return Result.success(filename);
}
上传文件图片保存到本地是因为,你的电脑这时等于一个服务器,所以是上传到了服务器,文件下载就是,浏览器从服务器加载资源显示
文件下载
@GetMapping("/download")
public void download(String name, HttpServletResponse response){
try {
//输入流,通过输入流读取文件内容
FileInputStream inputStream = new FileInputStream(new File(baseUrl + name));
//输出流,通过输出流将文件写回浏览器
ServletOutputStream outputStream = response.getOutputStream();
response.setContentType("image/jpeg");
byte[] bytes = new byte[1024];
int len=0;
//读取图片的输入io流放到bytes数组中
while((len=inputStream.read(bytes))!=-1){
outputStream.write(bytes,0,len);
outputStream.flush();
}
//关闭资源
inputStream.close();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}