本地存储
受限
开发中比较少用
如果直接存储在服务器的磁盘目录中,存在以下缺点:
不安全:磁盘如果损坏,所有的文件就会丢失
容量有限:如果存储大量的图片,磁盘空间有限(磁盘不可能无限制扩容)
无法直接访问
为了解决上述问题呢,通常有两种解决方案:
自己搭建存储服务器,如:fastDFS 、MinIO
使用现成的云服务,如:阿里云,腾讯云,华为云
Controller 层
- 需要注意的是:
- 避免相同文件名的覆盖,所以采取了使用UUID
- 但是使用UUID也只是随机生成一个文件名,但是没有后缀,因此,需要获得后缀,之后加上去
MultipartFile 常见方法:
String getOriginalFilename(); //获取原始文件名
void transferTo(File dest); //将接收的文件转存到磁盘文件中
long getSize(); //获取文件的大小,单位:字节
byte[] getBytes(); //获取文件内容的字节数组
InputStream getInputStream(); //获取接收到的文件内容的输入流
java
@Slf4j
@RestController
public class UploadController {
@PostMapping("/upload")
public Result upload(String name, Integer age, MultipartFile image) throws IOException {
log.info("文件上传 {},{},{}",name,age,image);
//获取原始文件名
/**
* 直接使用原始名是有问题的,如果相同的命名文件上次,会覆盖之前的文件
*/
String originalFilename = image.getOriginalFilename();
// 构造唯一的文件名(不能重复) --uuid(通用唯一识别码) 然后还需要加上扩展名
//截取最后一个.后面的即是扩展名
String extname=originalFilename.substring(originalFilename.lastIndexOf("."));
String newFilename= UUID.randomUUID().toString()+extname; //随机名+文件扩展名
//将文件存储在服务器磁盘中 E:\images
/**
* 文件名不能写死,避免只有一个文件,和文件格式不一样的情况
* 下面这个方法会爆红,需要抛出异常
*/
image.transferTo(new File("E:\\images\\"+newFilename));
return Result.success();
}
}
解除限制大小
那么如果需要上传大文件,可以在application.properties进行如下配置:
配置单个文件最大上传大小 spring.servlet.multipart.max-file-size=10MB 配置单个请求最大上传大小(一次请求可以上传多个文件) spring.servlet.multipart.max-request-size=100MB