上一节讲解了如何利用MultipartFile接收浏览器端上传的文件,这节讲解服务器端如何将文件保存到本地目录下,下节讲解服务端如何将文件保存在阿里云上。
本节需要解决两个难点:
- 文件重名问题
- 文件大小限制问题
存储文件
首先解决如何存储文件的问题,调用MultipartFile提供的方法transferTo
- 方法名:transferTo
- 方法参数:File类型
@PostMapping("/upload")public Result upload(String username, Integer age,MultipartFile image) throws IOException {log.info("文件上传:{},{},{}",username,age,image);//存储到本地文件中image.transferTo(new File("C:\\Users\\luoting\\Desktop\\codeLearn\\java\\day11-SpringBootWeb案例\\01.txt"));return Result.success();}
但是01.txt固定了文件的名称与类型,所以我们需要解决文件名称和类型的问题
文件类型
MultipartFile提供的方法能够获取客户端传递的原始文件名,通过截取字串的操作获取文件类型
//文件类型 123.1.1.jpg
String originalFilename = image.getOriginalFilename();
//我们需要最后一个点后面的部分
//1、获取最后一个点的坐标
int index=originalFilename.lastIndexOf(".");
//2、截取子串
String extraName = originalFilename.substring(index);
文件名
利用UUID生成唯一的文件名
//文件名
//利用UUID生成
String basicName= UUID.randomUUID().toString();
//生成最终的文件名
String fileName=basicName+extraName;
最终代码
@PostMapping("/upload")public Result upload(String username, Integer age,MultipartFile image) throws IOException {log.info("文件上传:{},{},{}",username,age,image);//(一)文件类型 123.1.1.jpgString originalFilename = image.getOriginalFilename();//我们需要最后一个点后面的部分//1、获取最后一个点的坐标int index=originalFilename.lastIndexOf(".");//2、截取子串String extraName = originalFilename.substring(index);//(二)文件名//利用UUID生成String basicName= UUID.randomUUID().toString();//生成最终的文件名String fileName=basicName+extraName;//(三)存储到本地文件中image.transferTo(new File("C:\\Users\\luoting\\Desktop\\codeLearn\\java\\day11-SpringBootWeb案例\\"+fileName));return Result.success();}
用postman测试post文件
注意:
- post请求的数据要填写在请求体(body)中
- 选择form-data方式
- 文件数据记得更改为文件类型
效果:在对应位置存放了相应的文件
文件大小
在SpringBoot中,默认单个文件的最大上传大小为1M,如果要更改,则需要在application.propertity中增加如下配置:
配置单个文件和单个请求的不同是:可以一次请求上传多个文件
注意配置项只需要记住一个关键词即可:multipart
#配置单个文件上传的最大大小
spring.servlet.multipart.max-file-size=10MB
#配置单个请求上传的最大大小
spring.servlet.multipart.max-request-size=100MB
本地存储方式的缺点
- 客户端无法直接访问服务端存储的文件
- 如果要存储大量文件,服务端的负荷很重
- 如果服务端发生故障,则存储的数据都会失效
于是,下节讲解如何存储到阿里云,当然也可以通过搭建集群的方式