1、创建一个Bucket
2、创建一个Access key
3、开发文档
https://help.aliyun.com/document_detail/32012.html?spm=a2c4g.11186623.6.924.610d6e1dtkI1dL
以下是开发需要使用的key:
Springboot整合OSS
1、导入依赖
<dependencies>
<!-- 阿里云oss依赖 -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
</dependency>
<!-- 日期工具栏依赖 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
</dependencies>
2、配置文件
#服务端口
server.port=port
#服务名
spring.application.name=service-oss
#环境设置:dev、test、prod
spring.profiles.active=dev
#阿里云 OSS
#不同的服务器,地址不同
aliyun.oss.file.endpoint=your endpoint
aliyun.oss.file.keyid=your accessKeyId
aliyun.oss.file.keysecret=your accessKeySecret
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=edu-school-cyrus
3、创建一个工具类获取oss中的配置
/**
* 读取配置文件中的内容
* 当spring加载后,执行接口的一个方法
*/
@Component
public class ConstantPropertiesUtils implements InitializingBean {
@Value("${aliyun.oss.file.endpoin}")
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 END_POINT;
public static String KEY_ID;
public static String KEY_SECRET;
public static String BUCKET_NAME;
/**
* 当上面的属性初始化后开始执行
*/
@Override
public void afterPropertiesSet() throws Exception {
//属性初始化后给相对应的静态变量赋值
END_POINT = endpoint;
KEY_ID = keyId;
KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
}
}
4、Controller层
@RestController
@RequestMapping("/eduoss/fileoss")
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);
}
}
5、Service实现类
@Service
public class OssServiceImpl implements OssService {
@Override
public String uploadFileAvatar(MultipartFile file) {
// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = ConstantPropertiesUtils.END_POINT;
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = ConstantPropertiesUtils.KEY_ID;
String accessKeySecret =ConstantPropertiesUtils.KEY_SECRET;
String bucketName = ConstantPropertiesUtils.BUCKET_NAME;
try {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上传文件流。
InputStream inputStream = file.getInputStream();
//获取全路径
String filename = file.getOriginalFilename();
//在文件名称中添加随机唯一值
String uuid = UUID.randomUUID().toString().replaceAll("-","");
filename = uuid + filename;
//在OSS中按时间日期进行分类文件夹存储
String dataPath = new DateTime().toString("yyyy/MM/dd"); //工具类
filename = dataPath +"/"+ filename;
/**
* <yourBucketName>:bucket名称
* <yourObjectName>:上传到oss文件路径和文件名称 =》 /a/1.jpg
*/
ossClient.putObject(bucketName, filename, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
/**
* 把上传之后的文件路径返回,自行拼接
* https://edu-school-cyrus.oss-cn-beijing.aliyuncs.com/A1F0EB0519EF22686F68E2E5E5D0C6C7.jpg
*/
String url = "https://"+bucketName+"."+endpoint+"/"+filename;
return url;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
存在问题:
1、可能存在上传同一文件名会默认进行覆盖
- 文件名加上随机值
//在文件名称中添加随机唯一值
String uuid = UUID.randomUUID().toString().replaceAll("-","");
filename = uuid + filename;
2、把文件进行分类管理
- 按时间
- 按名称
String dataPath = new DateTime().toString("yyyy/MM/dd"); //工具类
filename = dataPath +"/"+ filename;