1:首先先在阿里云上开通oss服务,/www.aliyun.com , 创建Bucket
2:根据官方sdk 示例去做即可
第一步,导入maven依赖:
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
第二步:
controller 写法:
@ApiOperation("通过java代码以文件流形式上传头像照片到阿里云oss")
@PostMapping("uploadFile")
public R uploadFile(MultipartFile file){
String url = ossService.uploadFile(file);
return R.ok().data("url",url);
}
service 写法
@Override
public String uploadFile(MultipartFile file) {
// 通过阿里云oss java sdk文档实例来写上传功能
// Endpoint以杭州为例,其它Region请按实际情况填写。
try {
String endpoint = constantPropertyConfiguration.ENDPOINT;
// 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建。
String accessKeyId = constantPropertyConfiguration.ACCESS_KEY_ID;
String accessKeySecret = constantPropertyConfiguration.ACCESS_KEY_SECRET;
String bucketName = constantPropertyConfiguration.BUCKET_NAME;
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上传文件流。
InputStream inputStream = file.getInputStream();
// 获取文件名称
String fileName = file.getOriginalFilename();
// 1:为什么防止文件名称重复被覆盖,我们给文件名加上uuid随机值
String uuid = UUID.randomUUID().toString().replaceAll("-","");
fileName=uuid+"-"+fileName;
// 2:为了文件在oss里面容易整理,我们根据时间来做文件管理
String datePath = new DateTime().toString("yyyy/MM/dd");
fileName = datePath+"/"+fileName;
ossClient.putObject(bucketName, fileName, inputStream);
// 关闭ossClient流
ossClient.shutdown();
//"url": "https://qiyu-onlinen.oss-cn-beijing.aliyuncs.com/2021/01/30/d9caf5ff40e944f494bc52e0183581e0-01.jpg"
String url = "https://"+bucketName+"."+endpoint+"/"+fileName;
return url;
} catch (Exception e) {
// e.printStackTrace();
throw new MyRuntimeException(ResultCode.ERROR,"上传文件异常");
}
}
定义加载constantPropertyConfiguration 类,调用application.properties中配置的密钥
@Component
// InitializingBean 这个类可以在spring 启动初始化的时候加载,afterPropertiesSet方法会执行,
// 因为我们定义的属性为私有private属性,所有外面调用不了,需要通过实现接口在方法中写
public class constantPropertyConfiguration implements InitializingBean {
// @Value 注解,可以读取application.properties配置文件中的值
@Value("${aliyun.oss.file.accesskeyid}")
private String accessKeyId;
@Value("${aliyun.oss.file.accesskeysecret}")
private String accessKeySecret;
@Value("${aliyun.oss.file.endpoint}")
private String endpoint;
@Value("${aliyun.oss.file.bucketname}")
private String bucketName;
public static String ACCESS_KEY_ID;
public static String ACCESS_KEY_SECRET;
public static String ENDPOINT;
public static String BUCKET_NAME;
// 这样我们就可以通过 constantPropertyConfiguration.ACCESS_KEYID 获取配置文件的值了
@Override
public void afterPropertiesSet() throws Exception {
ACCESS_KEY_ID=accessKeyId;
ACCESS_KEY_SECRET=accessKeySecret;
ENDPOINT=endpoint;
BUCKET_NAME=bucketName;
}
}