第一步:
创建bucket,在Bucket管理或Bucket 列表中点击“创建Bucket”,弹出创建Bucket 页面
Bucket名称,又称bucket命名空间,是全局唯一的,不能重复,其他选项按自己的需求来选择
Bucket创建完成后,在bucket列表可以看到刚自己创建的Bucket
第二步:文件上传
1、在bucket列表中,点击“Bucket名称” 进入Bucket
2、进入“文件管理—>文件列表” ,点击“文件上传按钮” 来上传文件
3、文件上传后,在文件列表可以看到已经上传的文件,点击文件名称或详情按钮;
在详情页面我们需要关注 url 模块,后期可以通过详情中的url去直接访问该文件,
如下图所示:
4、设置阿里云访问的AccessKey管理
1)点击:用户—>选择AccessKey 管理——>弹框点击“开始使用子用户AccessKey”,进入RAM
访问控制管理的用户管理页面
2)点击“创建用户” 来创建RAM访问的子用户
输入 用户名称和显示名称,如:这里显示名称和用户名称一致,
根据自己的业务场景勾选访问方式,这里勾选变成访问
注意关注:AccessKey Id 和 AccessKey Secret 的值
第二步:对创建的子用户授权
在Bucket列表选中自己需要操作的Bucket,进入 “权限控制—>Bucket 授权策略”,点击“新增授权”
按钮,对刚创建的用户进行授权
第三步:设置OSS可以跨域访问:
选中一个bucket,如 "gulimall-v001",点击“数据安全—>跨域设置—>创建规则”,配置允许跨域的请求来源;
请求来源:输入允许跨域的请求来源,“*” 表示允许所有的请求跨域
允许Methods:勾选允许跨域的请求方式
第四步:使用java上传文件
注意:java 使用oss上传文件的步骤是参考OSS官方文档,
1、在java项目中导入oss的依赖包,
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
2、编写测试代码
public void testUpload() throws com.aliyuncs.exceptions.ClientException {
// 填写Bucket名称,
String bucketName = "gulimall-v001";
String objectName = "hello.txt";//在oss上显示的文件名称
String endpoint = "oss-cn-shanghai.aliyuncs.com";
String accessKey = "LTAI5tHB6gQG3v5BjgLtArdG";
String secretKey = "OUtaPHhPsrWTmmvwNvLcfE9wsnT5m7";
OSS ossClient = new OSSClientBuilder().build(endpoint,accessKey,secretKey);
try {
String content = "Hello OSS";
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
} catch (OSSException oe) {
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Error Message:" + ce.getMessage());
System.out.println(ce);
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
System.out.println("上传成功");
}
第三步:spring cloud 整合OSS测试
1)引入Spring cloud oss 整合依赖(从maven 中央仓库搜索依赖)
<!--oss 依赖
注意:这里的版本跟 dependencyManagement中的 spring cloud alibaba依赖的版本不一样,
所以这里要单独添加oss依赖
oss依赖的版本是由spring-cloud-alibaba-dependencies 的版本控制的,该版本是 2.1.0.RELEASE
-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alicloud-oss</artifactId>
</dependency>
2)配置 access-key, secret-key 和 endpoint,如:
#配置alibaba oss服务
alicloud:
access-key: LTAI5tHB6gQG3v5BjgLtAr
secret-key: OUtaPHhPsrWTmmvwNvLcfE9wsn
oss:
endpoint: ss-cn-shanghai.aliyuncs.com
3)编写测试代码
/**
* spring cloud整合oss测试:
*
* @throws com.aliyuncs.exceptions.ClientException
*/
@Test
public void testUploadForCloud() throws com.aliyuncs.exceptions.ClientException {
// 填写Bucket名称,
String bucketName = "gulimall-v001";
// 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
String objectName = "hello.txt";//在oss上显示的文件名称
try {
String content = "Hello OSS";
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
} catch (OSSException oe) {
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
在spring cloud 中获取oss签名的示例代码:
@Slf4j
@RestController
public class OssController {
@Autowired
private OSS ossClient;
@Value("${spring.cloud.alicloud.oss.bucket}")
private String bucket;
@Value("${spring.cloud.alicloud.oss.endpoint}")
private String endpoint;
@Value("${spring.cloud.alicloud.access-key}")
private String accessKey;
@Value("${spring.cloud.alicloud.secret-key}")
private String secret;
/**
* 文件上传前的获取签名以及文件上传的一些配置,
* 在vue页面完成文件上传的操作
* @return
*/
@RequestMapping("/oss/policy")
public R policy(){
//请求oss地址:https://bucket+"."+endpoint
String host = "https://"+bucket+"."+endpoint;
//设置上传文件的前缀(即目录,即每天上传的文件在一个目录中)
String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String dir = format+"/";
Map<String,String> rspMap = null;
try {
//过期时间30s
long expireTime = 30;
long expireEndTime = System.currentTimeMillis()+expireTime*1000;
Date expiration = new Date(expireEndTime);
/**
*
*/
PolicyConditions policyConds = new PolicyConditions();
policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE,0,1048576000);
policyConds.addConditionItem(MatchMode.StartWith,PolicyConditions.COND_KEY,dir);
String postPolicy = ossClient.generatePostPolicy(expiration,policyConds);
byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);
//加密
String encodePolicy = BinaryUtil.toBase64String(binaryData);
//生成签名
String signature = ossClient.calculatePostSignature(postPolicy);
rspMap = new LinkedHashMap<String,String>();
rspMap.put("accessId",accessKey);
rspMap.put("host",host);
rspMap.put("dir",dir);
rspMap.put("policy",encodePolicy);
rspMap.put("signature",signature);
rspMap.put("expire",String.valueOf(expireEndTime/1000));
//todo: 最后跨域的操作在网关统一解决
}catch (Exception e){
log.error(e.getMessage());
}
return R.ok().put("data",rspMap);
}
}