一、概念
(一)文件上传概念: 指将本地的图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。
(二)前端文件上传三元素
- method=“post”(form)
- enctype=“multipart/form-data”(form)
enctype 指的是 Encode Type 编码格式 - type=“file”(input)
<form method="post" action="/upload" enctype="multipart/form-data">
<input type="file" name="image" />
<input type="submit" />
</form>
(三)后端文件上传
@RestController
public class UploadController{
@PostMapping("/upload")
public Result upload(@RequestParam("image") MultipartFile image){
return Result.success();
}
}
二、本地存储
(一)概念: 本地存储是将本机作为服务器进行存储文件。
(二)MultipartFile类的相关API
方法 | 说明 |
---|---|
String getOriginalFilename() | 获取原始方法名 |
void transferTo(File dest) | 将接收的文件存储到磁盘上 |
long getSize() | 获取文件的大小(Byte)。 |
byte[] getBytes() | 获取文件内容的字节数组 |
InputStream getInputStream() | 获取接收文件的输入流 |
(三)实现方法——transferTo(File file)
@RestController
public class UploadController{
@PostMapping("/upload")
public Result upload(@RequestParam("image") MultipartFile image){
//获取文件原始名
String originalFilename= image.getOriginalFilename();
//本地存储
image.transferTo(new File("指定存储地址\\" + originalFilename)); //可以自定义文件名
return Result.success();
}
}
(四)注意的问题
1、重复文件名覆盖
由于网站面向用户并发,所以我们需要区分上传的文件,我们可以使用唯一标识的方式命名文件(UUID,雪花算法等等…)
2、本地存储大小的限制
上传文件必定有大小,有大小必定有默认值,SpringBoot 默认单个文件最大大小为 1 MB , 通过以下配置进行修正。
spring:
servlet:
multipart:
#单个文件上传的大小
max-file-size: 10MB
#一次请求上传的大小
max-request-size: 100MB
3、本地存储的局限性
- 浏览器无法直接访问服务器
- 服务器无法随意扩容(服务器比较贵)
- 服务器磁盘可能面临损坏的情况
- …
4、解决方案
- 本地服务器(FastDFS文件系统、MinIO系统…)
- 云服务器(阿里云、腾讯云、华为云…)
三、云存储(以阿里云为例)
官方地址: 阿里云-对象存储OSS