上传头像开发-集成阿里云OSS
一、对象存储OSS
为了解决海量数据存储与弹性扩容,项目中我们采用云存储的解决方案- 阿里云OSS。
1、开通“对象存储OSS”服务
(1)开通“对象存储OSS”服务
(2)进入管理控制台
2、创建Bucket
选择:标准存储、公共读、不开通
![](https://img2020.cnblogs.com/blog/2033226/202010/2033226-20201006163555505-1204249933.png)
二、使用SDK
三、后端代码
1、引入项目依赖
<dependencies> <!-- 阿里云oss依赖 --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version>2.10.1 </dependency> <!-- 日期工具栏依赖 这个不是,是个工具类--> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.10.1</version> </dependency> </dependencies>
2、application.properties配置
ConstantPropertiesUtils
#服务端口
server.port=8002
#服务名
spring.application.name=service-oss
#环境设置:dev、test、prod
spring.profiles.active=dev
#阿里云 OSS
#不同的服务器,地址不同
aliyun.oss.file.endpoint=你的路径我的是oss-cn-beijing.aliyuncs.com
aliyun.oss.file.keyid=你的keyid
aliyun.oss.file.keysecret=你的keysecret
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=你的bucketname
3、创建util类读取配置信息
package com.atguigu.oss.util;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* 读取配置文件中的内容 当项目已启动,spring加载之后,执行接口一个方法
*/
@Component
public class ConstantPropertiesUtils implements InitializingBean {
//当spring把值加载后 afterPropertiesSet方法就会执行
//读取配置文件中的内容
@Value("${aliyun.oss.file.endpoint}")
private String endpoint;
@Value("${aliyun.oss.file.keyid}")//对应的配置信息里的名字
private String keyid;
@Value("${aliyun.oss.file.keysecret}")
private String keysecret;
@Value("${aliyun.oss.file.bucketname}")
private String bucketname;
//定义静态常量
public static String EDNPOINT;
public static String KEYID;
public static String KEYSECRET;
public static String BUCKETNAME;
@Override
public void afterPropertiesSet() throws Exception {
EDNPOINT=endpoint;
KEYID=keyid;
KEYSECRET=keysecret;
BUCKETNAME=bucketname;
}
}
4、Service
package com.atguigu.oss.service.serviceimpl;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.atguigu.oss.service.OssService;
import com.atguigu.oss.util.ConstantPropertiesUtils;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.UUID;
@Service
public class OssServiceImpl implements OssService {
@Override
public String uploadFileAvatar(MultipartFile file) {
String endpoint = ConstantPropertiesUtils.EDNPOINT;
String accessKeyId = ConstantPropertiesUtils.KEYID;
String accessKeySecret = ConstantPropertiesUtils.KEYSECRET;
String bucketName=ConstantPropertiesUtils.BUCKETNAME;
try{
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上传文件流。
InputStream inputStream = file.getInputStream();
//获取文件名称
String fileName=file.getOriginalFilename();
//在文件中添加随机值 uuid
String uuid= UUID.randomUUID().toString().replaceAll("-","");
fileName=uuid+fileName;
//获取当前日期
String dataPath= new DateTime().toString("yyyy/MM/dd");
fileName=dataPath+"/"+fileName;
ossClient.putObject(bucketName, fileName, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
String url="https://"+bucketName+"."+endpoint+"/"+fileName;
return url;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
5、Controller
package com.atguigu.oss.controller;
import com.atguigu.commonutils.R;
import com.atguigu.oss.service.OssService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/eduoss/fileoss")
@CrossOrigin
public class OssController {
@Autowired
private OssService ossService;
//上次头像方法
@PostMapping
public R uploadOssFile(MultipartFile file){
//获取上传的文件 MultipartFile
//返回上次到OSS的路径
String url =ossService.uploadFileAvatar(file);
return R.ok().data("url",url);
}
}
效果: