天翼云对象存储网上资料太少,目前还属于小众对象存储选择.本人在阅读官方API文档和提工单询问客服的基础上做以下入门教学,如有不当之处敬请谅解,更深入的操作还需与大家交流探讨.
1.准备工作(下载官方开发者文档、SDK)
开发者文档-对象存储(原生版)I型-SDK参考 - 天翼云
用户手册-对象存储(原生版)I型-文档下载 - 天翼云
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使用手册进行其他操作的开发,这里就不一一赘述了,有问题可以私信或者回复我进行后续探讨.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/128954.html