天翼云对象存储网上资料太少,目前还属于小众对象存储选择.本人在阅读官方API文档和提工单询问客服的基础上做以下入门教学,如有不当之处敬请谅解,更深入的操作还需与大家交流探讨.
1.准备工作(下载官方开发者文档、SDK)
2.注册并开通天翼云对象存储(这里以原生版为例)
在官方控制台找到access-key、secret-key、endpoint
PS:官方控制台打开一定要把地区切换到自己开通时选择的地区
3.在项目中导入maven仓库中没有的jar
这里已lib文件夹方式添加,pom文件中扫描本地方式引入依赖
<!-- 天翼云对象存储 -->
<dependency>
<groupId>aws.java.sdk.core</groupId>
<artifactId>awscore</artifactId>
<version>1.11</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/aws-java-sdk-core-1.11.998.jar</systemPath>
</dependency>
<dependency>
<groupId>aws.java.sdk.kms</groupId>
<artifactId>awskms</artifactId>
<version>1.11</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/aws-java-sdk-kms-1.11.998.jar</systemPath>
</dependency>
<dependency>
<groupId>aws.java.sdk.s3</groupId>
<artifactId>awss3</artifactId>
<version>1.11</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/aws-java-sdk-s3-1.11.998.jar</systemPath>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.8.1</version>
</dependency>
pom需添加下述配置以保证打包的完整性
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
4.编写客户端配置类
yml文件中添加2中找到的access-key、secret-key、endpoint
@Component
public class ZosClient {
@Value("${zos.config.endpoint}")
private String endPoint;
@Value("${zos.config.access-key}")
private String accessKey;
@Value("${zos.config.secret-key}")
private String secretKey;
@Bean
public AmazonS3 getS3Client() {
AmazonS3 s3Client;
// 使用凭据和配置建立连接
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
ClientConfiguration awsClientConfig = new ClientConfiguration();
// 使用V2签名时,采用"S3SignerType"
awsClientConfig.setSignerOverride("S3SignerType");
// 使用V4签名时,采用"AWSS3V4SignerType"
//awsClientConfig.setSignerOverride("AWSS3V4SignerType");
// 连接默认使用HTTPS协议,使用HTTP协议连接时需要显式指定
awsClientConfig.setProtocol(Protocol.HTTP);
s3Client = AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.withClientConfiguration(awsClientConfig)
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, ""))
.disableChunkedEncoding()
.build();
return s3Client;
}
}
5.编写工具类
5.1创建桶
/**
* 创建桶
* @param bucketName
* @return
*/
@Override
public void addBucket(String bucketName) {
//桶名称必须唯一
System.out.println();
System.out.println("新增bucketName=" + bucketName);
AmazonS3 s3Client = zosClient.getS3Client();
CreateBucketRequest var = new CreateBucketRequest("");
var.setBucketName(bucketName);
var.setObjectLockEnabledForBucket(false);
var.setCannedAcl(CannedAccessControlList.PublicRead);
s3Client.createBucket(var);
System.out.println("天翼云对象存储桶bucket创建成功");
}
桶的命名规则
5.2删除桶
/**
* 删除桶
* 删除之前要求 Bucket 为空,也就是Bucket内部Object为空。
* @param bucketName
* @return
*/
@Override
public void deleteBucket(String bucketName) {
System.out.println("删除桶bucketName=" + bucketName);
//1.删除前需要判断bucket下没有object才可以删除
AmazonS3 s3Client = zosClient.getS3Client();
//列出Object
ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
listObjectsRequest.setBucketName(bucketName);
ObjectListing objectListing = s3Client.listObjects(listObjectsRequest);
List<S3ObjectSummary> objectSummaries = objectListing.getObjectSummaries();
if(objectSummaries != null && objectSummaries.size() > 0){
System.out.println("bucket下有object,不允许删除!");
}
//2.删除对象存储的桶
DeleteBucketRequest var = new DeleteBucketRequest("");
var.setBucketName(bucketName);
s3Client.deleteBucket(var);
System.out.println("删除桶成功");
}
5.3文件上传并返回临时下载地址
/**
* 文件上传并返回临时下载地址
* @param file
* @param bucketName 桶名称
* @param objectName object的key
* @return url
*/
@Override
public String uploadFile(MultipartFile file, String bucketName, String objectName) throws Exception {
InputStream inputStream = null;
//文件名称
String name = file.getOriginalFilename();
inputStream = file.getInputStream();
AmazonS3 s3Client = zosClient.getS3Client();
System.out.println("对象存储连接成功");
//创建上传Object的ObjectMetadata
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setCacheControl("no-cache");
objectMetadata.setHeader("Pragma", "no-cache");
objectMetadata.setContentLength(inputStream.available());
//准备ZOS上传对象请求PutObjectRequest
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName,inputStream, objectMetadata);
putObjectRequest.setMetadata(objectMetadata);
//设置上传object的ACL为公共读or私有写
putObjectRequest.setCannedAcl(CannedAccessControlList.PublicRead);
//1.上传对象存储
s3Client.putObject(putObjectRequest);
System.out.println("对象存储上传成功");
//2.获取文件下载地址
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName);
//GenertaePresignedUrl临时预签名的下载地址默认过期时间是900s
URL url = s3Client.generatePresignedUrl(request);
String result = url.toString();
System.out.println("对象存储获取下载地址成功url=" + result);
return result;
}
5.4删除对象
/**
* 删除object
* @param bucketName
* @param objectName
*/
@Override
public void deleteObject(String bucketName, String objectName) {
System.out.println("删除object对象bucketName=" + bucketName + "&objectName=" + objectName);
//删除对象存储中数据
AmazonS3 s3Client = zosClient.getS3Client();
s3Client.deleteObject(bucketName,objectName);
System.out.println("删除object成功");
}
使用的过程中还遇到的问题:
1.通过SDK创建的桶,上传的文件在官方控制中心无法下载
答:需要设置桶的权限,包括跨域等等
2.建立连接时V2签名和V4签名的区别,使用哪一个?
答:v2和v4签名都可以使用,最大的区别是v4签名会校验http_host
3.桶下不存在实际意义的文件夹,控制台看到的文件夹实际上是以object的key中"/"创建的,这种形式的key最好不要以"/"开头,否则会有后续问题(比如桶的挂载问题,有关挂载问题可以参考天翼云对象存储s3fs挂载流程-CSDN博客)
上述操作以对象存储基本操作为基础,大家可以参考官方提供的SDK使用手册进行其他操作的开发,这里就不一一赘述了,有问题可以私信或者回复我进行后续探讨.