前端
我们要用一个form表单,前端页面三要素:
- 方法要用POST
- enctype设置为“multipart/form-data”,若不改则只提交文件名
- 内部一个type为file的input组件
POSTman
若用postman等软件来测试时:
- 方法要用POST
- Body中选择form-data
- 在key中选择file而不是txt,value中选择要上传的文件
后端
import org.springframework.web.multipart.MultipartFile
需要通过MultipartFile这个类接收:
- 在SpringBoot中,文件上传,默认单个文件允许最大大小为1M,可在配置文件中配置。
- spring.servlet.multipart.max-file-size=10MB #配置单个文件最大上传大小
- spring.servlet.multipart.max-request-size=100MB #配置单个请求最大上传大小(一次请求可以上传多个文件)
- 接收后会在本地存一份.temp的临时文件,当方法结束后会自动删除
- 该对象有两个变量:
- part:
- fileitem:具体文件
- location:临时文件地址
- filename:文件名
- part:
本地存储(业务不常用(但是免费))
首先介绍几个用的到的api:
- String getOriginalFilename(); 获取原始文件名
- void transferTo(File dest);//将接收的文件转存到磁盘文件中
- long getSize();//获取文件的大小,单位:字节
- byte[] getBytes();//获取文件内容的字节数组
- InputStream getinputStream();//获取接收到的文件内容的输入流
介绍一下流程:
- 后端接收到MultipartFile对象
- 取出文件名的后缀,拼接上UUID,防止文件覆盖问题
- String originalFilename = 文件对象.getOriginalFilename();
- int index = originalFilename.lastIndexOf(".");
- String extname = originalFilename.substring (index);
- String newFileName = UUID.randomUUID().toString() + extname;
- 存起来:文件对象.transferTo(new File("E:/images/"+newFileName));
OSS对象存储(以阿里云举例)
首先介绍一下几个概念:
- Bucket:存储空间是用户用于存储对象(Object,就是文件)的容器,所有的对象都必须隶属于某个存储空间。
- SDK:软件开发工具包,包括辅助软件开发的依赖(jar包)、代码示例等
介绍一下准备工作:
- 注册账号
- 开通OSS服务
- 创建bucket,将读写权限设置为公共读
- 在头像处创建AccessKey,此时拿到AccessKey ID和AccessKey Secret
- 参考官方文档,引入SDK
- 根据示例代码进行修改,执行后查看文件列表,若上传成功则说明绑定成功
这时候就可以把OSS集成到之前的功能中了
-
接收上传的图片
- 文件对象.getinputStream()获取其Input流
- 同上拿到newFileName
-
将图片存储起来(OSS)
OSS ossClient = new OSSClientBuilder().bpuild(endpoint, accessKeyId, accessKeySecret) ossClient.putOķject(bucketName, fileName, inmputStream) -
拼接图片访问的url并返回
注意:
其中第二步中endpoint, accessKeyId, accessKeySecret,bucketName最好配置在配置文件中
然后使用@Value("${key}")注解注入到变量中
或者是用配置@ConfigurationProperties类后用@Autowired注入到对象中
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
private String endpoint;
private String
accessKeyId;
private String
accessKeySecret;
private String bucketName;
}