天翼云对象存储入门教学

        天翼云对象存储网上资料太少,目前还属于小众对象存储选择.本人在阅读官方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使用手册进行其他操作的开发,这里就不一一赘述了,有问题可以私信或者回复我进行后续探讨.

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值