1. 开通oss服务
创建 AccessKey
获取 连接的accessKey
2. 使用java 操作阿里云oss
- 创建一个java项目maven 版本
导入所需的必须jar包(这里我没有写版本)
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
</dependency>
- 进行相关属性的配置
aliyun.oss.file.endpoint
aliyun.oss.file.keyid
aliyun.oss.file.keysecret
aliyun.oss.file.bucketname
以上四个属性都是在阿里云中,复制下来就可 - 创建启动类,启动项目
没有数据源,因为我们只是上传文件,不需要数据源即数据库
- 解决方法:
- 添加数据源即数据库配置文件
- 在启动类添加属性,默认不加载数据库的配置
重新启动 成功
2.1 从配置文件中获取相对应的属性值
- 使用注解
@Value("${aliyun.oss.file.endpoint}")
可以直接拿到配置文件的属性值 - 给类上加注解
@component
将类交给spring管理 - 继承
InitializingBean
类,在工程启动spring进行加载的时候就会执行该类 - 在类中创建出公共的静态属性,可以直接类名点 属性名进行取值
//项目一启动 spring中的接口 spring加载后,执行接口中的方法
@Component
public class ConstantPropertiesUtils implements InitializingBean {
//读取配置文件
@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 END_POINT;
public static String KEY_ID;
public static String KEY_SERRCT;
public static String BUCKET_NAME;
//这个方法在上面的值初始化完成后,就会执行
@Override
public void afterPropertiesSet() throws Exception {
END_POINT=this.endpoint;
KEY_ID=this.keyid;
KEY_SERRCT=this.keysecret;
BUCKET_NAME=this.bucketname;
}
}
2.2 创建controller 写入阿里上传逻辑
@Override
public String uploadFileAvatar(MultipartFile file) {
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = ConstantPropertiesUtils.END_POINT;
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = ConstantPropertiesUtils.KEY_ID;
String accessKeySecret = ConstantPropertiesUtils.KEY_SERRCT;
String bucketname = ConstantPropertiesUtils.BUCKET_NAME;
try {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
InputStream inputStream = file.getInputStream();
//获取文件名称
String fileName = file.getOriginalFilename();
// 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。
//第一个参数 buchet的名称
//第二个参数 上传oss文件的路径和名称 /aa/bb/c.jpg
//第三个参数 上传文件的输入流
ossClient.putObject(bucketname, fileName, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
//把上传之后的文件路径返回
//需要把上传到阿里云oss路径手动拼接出来
String url="https://"+bucketname+"."+endpoint+"/"+fileName;
return url;
}catch (Exception e){
System.out.println("上传文件出现异常");
return null;
}
}
结果:
2.3 遇到的问题:
- 多次上传同一个文件,后上传的文件会将前面上传的文件进行覆盖
解决: 只需要将文件名字每次设置为不同即可