知识梳理:
今天要学的知识很实用,一个合格的项目里面肯定会用到这个技术,那就是文件上传,文件上传可以帮我们上传头像、excel表格。等,用过文件上传的小伙伴都是文件上传到哪里去呢?本人第一次上传文件是上传到项目的某个文件夹里面或者数据库里面进行储存,这样很不友好,最大的问题是一旦文件多了就很占内存,今天就来学习一下阿里云提供的对象存储oss,阿里云地址是:https://www.aliyun.com/
准备工作:
- 注册阿里云账号
- 开通对象存储OSS服务
- 获取AccessKey
- 创建Bucket 列表
第一步:创建Bucket 列表,创建的时候参数可以跟我选一样,看个人
第二步:获取AccessKey
第三步:引入依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
第四步:在项目配置文件中配置秘钥,第一个参数是你 地域节点 第二和第三参数是秘钥 第四参数是你创建的Bucket名称
#阿里云oss密钥
aliyun:
oss:
endpoint: oss-cn-beijing.aliyuncs.com
accessKeyId:
secret:
bucket:
第五步:初始化,读取配置参数
@Component
public class ConstantOssPropertiesUtils implements InitializingBean {
@Value("${aliyun.oss.endpoint}")
private String endpoint;
@Value("${aliyun.oss.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.oss.secret}")
private String secret;
@Value("${aliyun.oss.bucket}")
private String bucket;
public static String EDNPOINT;
public static String ACCESS_KEY_ID;
public static String SECRECT;
public static String BUCKET;
@Override
public void afterPropertiesSet() throws Exception {
EDNPOINT=endpoint;
ACCESS_KEY_ID=accessKeyId;
SECRECT=secret;
BUCKET=bucket;
}
}
第六步:编写具体的实现,这里的id是后来加的,因为当时只顾着上传的,以后加了用户头像上传,这个的id是表示那个用户,也可以不加id也能上传
ps:MultipartFile,接收用户上传的头像
/**
* 用户上传的头像
* @param file id
* @return
*/
@PostMapping("/uploadAvatar/{id}")
public R uploadAvatar(MultipartFile file,@PathVariable Integer id){
return userService.uploadAvatar(file,id);
}
第七步:直接看业务层具体代码
@Override
public R uploadAvatar(MultipartFile file,Integer id) {
//设置相关参数
String ednpoint = ConstantOssPropertiesUtils.EDNPOINT;
String accessKeyId = ConstantOssPropertiesUtils.ACCESS_KEY_ID;
String accessKeySecret= ConstantOssPropertiesUtils.SECRECT;
String bucketName = ConstantOssPropertiesUtils.BUCKET;
if(file.isEmpty()){
return R.error("上传的文件不能为空");
}
//上传文件流
try {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(ednpoint, accessKeyId, accessKeySecret);
InputStream inputStream = file.getInputStream();
String fileName=file.getOriginalFilename();
//生成随机唯一值,使用uuid,添加到文件名称里面
String uuid= UUID.randomUUID().toString().replace("-","");
fileName=uuid+fileName;
//按照当前日期,创建文件夹,上传到创建文件夹里面
// /2021/02/02/ 01.jpg
String timeUrl = new DateTime().toString("yyyy/MM/dd");
fileName=timeUrl+"/"+fileName;
//调用方法实现上传
//1.JPG
ossClient.putObject(bucketName,fileName,inputStream);
//关闭ossClient
ossClient.shutdown();
//https://xxxxx.oss-cn-beijing.aliyuncs.com/01.png
//上传后路径
String url="https://"+bucketName+"."+ednpoint+"/"+fileName;
User user=new User();
user.setId(id);
user.setUrl(url);
this.updateById(user); //上传后修改数据原来的头像路径
return R.ok(url);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
上传之前:Bucket里面最开始是没有图片的,数据库可以没有路径,还没有上传,
选择图片:我就上传这个1.jpg这个图片
上传图片:我只用swagger-ui进行上传,已经上传成功了,数据库也存了图片的路径,用路径能直接下载图片