文件上传,也称为upload,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。
![](https://img-blog.csdnimg.cn/img_convert/12b53beae14306847a3fe61bc45b6464.png)
![](https://img-blog.csdnimg.cn/img_convert/d66517bc769fcc459eb2b17734b13d27.png)
![](https://img-blog.csdnimg.cn/img_convert/c77f207fb92fcfc01e417233e419fe44.png)
文件上传:
![](https://img-blog.csdnimg.cn/img_convert/b05d1bc6cc825b28fc3c137659026105.png)
上传逻辑:
1). 获取文件的原始文件名, 通过原始文件名获取文件后缀
2). 通过UUID重新声明文件名, 文件名称重复造成文件覆盖
3). 创建文件存放目录
4). 将上传的临时文件转存到指定位置
编写文件上传的方法, 通过MultipartFile类型的参数即可接收上传的文件, 方法形参的名称需要与页面的file域的name属性一致。
//进行文件的上传和下载
@RestController
@Slf4j
@RequestMapping("/common")
public class CommonController {
// 从yml获取数据
@Value("${reggie.path}")
private String basePath;
// spring框架封装一个参数
@PostMapping("/upload")
public R<String> upload(MultipartFile file) throws IOException {
// file是一个临时文件,需要转存到指定位置,否则本次请求后临时文件删除,需要使用参数file,不能改成其他的,与前端对应
log.info(file.toString());
// 获得图片原始文件名,获取上传的文件名
String originalFilename=file.getOriginalFilename();
String suffix=originalFilename.substring(originalFilename.lastIndexOf("."));
// 防止文件重复造成文件覆盖使用uuid进行命名
String fileName= UUID.randomUUID().toString()+suffix;
// 创建一个目录对象
File dir=new File(basePath);
// 判断目录是否存在
if(!dir.exists()){
// 目录不存在,需要创建
dir.mkdir();
}
//将临时文件转存到指定位置
file.transferTo(new File(basePath+fileName));
return R.success(fileName);
}
文件下载:
![](https://img-blog.csdnimg.cn/img_convert/607b06cc6c7582c9debba4d4a9be9adb.png)
在 CommonController 中定义方法download,并接收页面传递的参数name,然后读取图片文件的数据,然后以流的形式写回浏览器。
具体逻辑如下:
1). 定义输入流,通过输入流读取文件内容
2). 通过response对象,获取到输出流
3). 通过response对象设置响应数据格式(image/jpeg)
4). 通过输入流读取文件数据,然后通过上述的输出流写回浏览器
5). 关闭资源
/文件下载
//通过输出流向页面返回数据 不需要返回值
// 通过流写二进制数据
// 输出流需要response获得
@GetMapping("/download")
public void download(String name, HttpServletResponse response) throws IOException {
//输入流,通过输入流读取文本内容
FileInputStream fileInputStream=new FileInputStream(new File(basePath+name));
//输出流,通过输出流将文件写回浏览器,在浏览器展示图片
ServletOutputStream outputStream=response.getOutputStream();
// 设置格式
response.setContentType("image/jpeg");
int len=0;
byte[] bytes=new byte[1024];
// -1表示没有结束
while ((len=fileInputStream.read(bytes))!=-1){
outputStream.write(bytes,0,len);
// 刷新
outputStream.flush();
// 关闭资源
outputStream.close();
fileInputStream.close();
}
}
通过yml设置图片存放地址,在application.yml中定义文件存储路径
![](https://img-blog.csdnimg.cn/img_convert/fa8f159abd9ed8f6c6c5b6be13e66447.png)