Java使用天翼云实现文件上传

  1. 首先要获取天翼云的一些配置信息。
    1. 要知道账户的access-key 表示访问天翼云存储服务的身份凭证之一,类似于一个“用户名”)。
    2. 其次是账户的secret-key 表示访问天翼云存储服务的另一个身份凭证,类似于“密码”)。
    3. 桶对象服务器所在的区域的endpoint  obs.cn-gdgz1.ctyun.cn 表示你连接的天翼云服务位于广东广州市的区域(Region)。cn-gdgz1 是区域代码,一般是endpoint的值。ctyun.cn 是天翼云的域名。不同区域有不同的 Endpoint 地址,连接时需要确保地址正确。)。
    4. 桶名称bucket(表示存储桶的名称,用于指定存储的数据位置。)
  2. 在java项目中引入天翼云所需要的依赖。
    1.  <!--天翼云依赖-->
              <dependency>
                  <groupId>com.amazonaws</groupId>
                  <artifactId>aws-java-sdk-s3</artifactId>
                  <version>1.11.336</version>
              </dependency>
              <!-- 使用sts服务需要添加以下依赖 -->
              <dependency>
                  <groupId>com.amazonaws</groupId>
                  <artifactId>aws-java-sdk-sts</artifactId>
                  <version>1.11.336</version>
              </dependency>
    2. 将天翼云的信息配置在java项目中配置文件中。
      # 文件上传 OOS (天翼云)
      oos:
        config:
          access-key: xxxxxxxxxxxx
          secret-key: xxxxxxxxxxxx
          endpoint: obs.cn-gdgz1.ctyun.cn
          bucket: xxxxx
    3.  创建天翼云的客户端。
      @Data
      @Component
      public class OosClientConfig {
          @Value("${oos.config.access-key}")
          private String accessKey;
      
          @Value("${oos.config.secret-key}")
          private String secretKey;
      
          @Value("${oos.config.endpoint}")
          private String endpoint;
      
          @Value("${oos.config.bucket}")
          private String bucket;
      
          @Bean
          public AmazonS3 oosClient() {
              BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
              ClientConfiguration clientConfiguration = new ClientConfiguration();
              AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration(
                      endpoint, "cn-gdgz1");
              return AmazonS3ClientBuilder.standard()
                      //客户端设置
                      .withClientConfiguration(clientConfiguration)
                      //凭证设置
                      .withCredentials(new AWSStaticCredentialsProvider(credentials))
                      //endpoint设置
                      .withEndpointConfiguration(endpointConfiguration)
                      .build();
      
          }
      }
    4. 创建天翼云对象上传,下载,删除等操作的工具类。
      @Slf4j
      @Component
      public class CTyunStorageUtil {
          
      
          //天翼云客户端注入
          @Autowired
          private  AmazonS3 s3;
          //天翼云配置类注入
          @Autowired
          private OosClientConfig config;
          //生产测试环境注入(因为我们的项目中要将测试环境和生产环境的地址区分开,每一个环境其实就是桶内的一个对象,因为一个桶内只能存储一百个对象,所以将不同的环境创建为一个对象,直接将文件存储到这个环境对象中,而这个文件对象中可以存储的文件数量不止100个)例如:prod/ ,env/
          @Value("${listener.env}")
          private String env;
          
      /**
           * 上传文件到对象存储中
           * @return
           */
          public boolean uploadFile( MultipartFile file) {
              try {
                  InputStream is = file.getInputStream();
                  ObjectMetadata meta = new ObjectMetadata();
                  meta.setContentLength(is.available());
                  //这种是区分环境的存储(也就是存储到桶内对象中)
                  // PutObjectRequest req = new PutObjectRequest(config.getBucket(),env +file.getOriginalFilename(), is, meta);
                  //这种是直接存储到桶内
                  PutObjectRequest req = new PutObjectRequest(
                          config.getBucket(),file.getOriginalFilename(), is, meta);
                  s3.putObject(req);
                  return true;
              } catch (AmazonServiceException e) {
                  System.err.println(e.getErrorMessage());
              } catch (Exception e) {
                  e.printStackTrace();
              }
      
              return false;
          }
          /**
           * 生成文件http链接 :一般存储的文件名就是这个objectKey
           * @return
           */
          public String getUrl(String objectKey) {
              // 这种是根据环境对象以及文件名来生成链接的
              //GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(config.getBucket(),env + objectKey);
             //这种是直接根据文件名来生成链接的
              GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(config.getBucket(),env + objectKey);
              URL presignedUrl  = s3.generatePresignedUrl(generatePresignedUrlRequest);
              String url = presignedUrl.toString().split("\\?")[0];
              // 输出生成的预签名 URL
              System.out.println("Presigned URL: " + url);
              return url;
          }
          /**
           * 根绝文件名来删除桶内文件
           * @return
           */
          public Boolean deleteFile(String objectKey) {
             
              try {
                  //根据不同的环境来删除相应环境中的文件
                  //s3.deleteObject(config.getBucket(), env + objectKey);
                  //根据文件名直接删除桶内对象
                  s3.deleteObject(config.getBucket(),  objectKey);
                  return true;
              } catch (AmazonServiceException e) {
                  System.err.println(e.getErrorMessage());
              }
              return false;
          }
          /**
           * 查询某个桶是否存在
           *
           * @return
           */
          public Boolean isExistsBucket(){
              boolean exists = s3.doesBucketExistV2(config.getBucket());
              if (exists) {
                  System.out.format("Bucket %s already exists.\n", config.getBucket());
              }
             return exists;
          }
          /**
           *获取对象中的对象文件列表
           */
          public List<String> getFileList(){
              List<String> fileList = CollectionUtil.newArrayList();
              // 列出对象
              ListObjectsRequest request = new ListObjectsRequest();
              request.withBucketName(config.getBucket());
              // 可选:设置前缀和分页参数
              //request.setPrefix(env);  // 如果需要限定特定目录的对象,如果没有环境对象则注释这个代码
              request.setMaxKeys(100); // 每次查询的最大结果数量
      
              // 获取对象列表
              try {
                  ObjectListing objectListing = s3.listObjects(request);
                  List<S3ObjectSummary> objectSummaries = objectListing.getObjectSummaries();
                  // 输出所有对象
                  for (S3ObjectSummary object : objectSummaries) {
                      System.out.println("Object Key: " + object.getKey());
                  }
                  if (Objects.nonNull(objectSummaries)) {
                      fileList = objectSummaries.stream().map(S3ObjectSummary::getKey).collect(Collectors.toList());
                  }
              } catch (Throwable e) {
                  System.err.println("Error: " + e.getMessage());
              }
              return fileList;
          }
          /**
           *查询对象中是否有该文件对象
           */
          public Boolean fileIsExists(String fileName){
              //根据环境查询某个对象是否存在
              //return getFileList().contains(env + fileName);
              //这届查询某个对象是否存在
              return getFileList().contains(fileName);
      
          }
      
      }
         
    5. 还有最重要的一点,一定要让运维人员放开对桶的操作权限以及桶内对象的操作权限,(ps:我在进行文件上传的时候就遇到了文件上传不成功,后来发现是因为没有开启对桶内对象的操作权限。)下面附上一段查询桶的权限的代码以及添加对桶内对象的权限。
      //          首先获取桶策略是否有对桶内对象操作的权限
              try {
                  BucketPolicy bucketPolicy = s3.getBucketPolicy(config.getBucket());
                  String policyText = bucketPolicy.getPolicyText();
                  System.out.println(policyText);
              } catch (AmazonServiceException e) {
                  System.err.println(e.getErrorMessage());
              }
      
       // 输出的桶策略
      //                "{\n" +
      //                "    \"Version\": \"2008-10-17\",\n" +
      //                "    \"Id\": \"Policy1733706663685\",\n" +
      //                "    \"Statement\": [\n" +
      //                "        {\n" +
      //                "            \"Sid\": \"自定义策略-bd00\",\n" +
      //                "            \"Effect\": \"Allow\",\n" +
      //                "            \"Principal\": {\n" +
      //                "                \"AWS\": [\"arn:aws:iam::a634bb5668fa413f89f3655c72e8b142:user/46caf01ab8c14c9e83c59648121aba7e\"]\n" +
      //                "            },\n" +
      //                "            \"Action\": [\"s3:*\"],\n" +
      //                "            \"Resource\": [\n" +
      
      //                "                \"arn:aws:s3:::whm-ota\",\n" + //这个是对桶操作的策略
      //                "                \"arn:aws:s3:::whm-ota/*\"\n" + //这个是对桶内对象操作的策略
      //                "            ]\n" +
      //                "        }\n" +
      //                "    ]\n" +
      //                "}";
      //如果Resource中没有对桶内对象操作的策略,就将上面json定义为一个字符串,然后设置桶策略。
      // 定义字符串的桶策略
      //               String bucketPolicy = "{\n" +
      //                "    \"Version\": \"2008-10-17\",\n" +
      //                "    \"Id\": \"Policy1733706663685\",\n" +
      //                "    \"Statement\": [\n" +
      //                "        {\n" +
      //                "            \"Sid\": \"自定义策略-bd00\",\n" +
      //                "            \"Effect\": \"Allow\",\n" +
      //                "            \"Principal\": {\n" +
      //                "                \"AWS\": [\"arn:aws:iam::a634bb5668fa413f89f3655c72e8b142:user/46caf01ab8c14c9e83c59648121aba7e\"]\n" +
      //                "            },\n" +
      //                "            \"Action\": [\"s3:*\"],\n" +
      //                "            \"Resource\": [\n" +
      
      //                "                \"arn:aws:s3:::whm-ota\",\n" + //这个是对桶操作的策略
      //                "                \"arn:aws:s3:::whm-ota/*\"\n" + //这个是对桶内对象操作的策略
      //                "            ]\n" +
      //                "        }\n" +
      //                "    ]\n" +
      //                "}";
       try {
                  SetBucketPolicyRequest policyRequest = new SetBucketPolicyRequest(config.getBucket(), bucketPolicy);
                  s3.setBucketPolicy(policyRequest);
                  System.out.println("Bucket policy set successfully.");
              } catch (Exception e) {
                  e.printStackTrace();
                  System.err.println("Error setting bucket policy: " + e.getMessage());
              }

  3. 更多的天翼云文件操作请查看官方文档:天翼云媒体存储 - 产品手册 (ctyun.cn)icon-default.png?t=O83Ahttps://console.xstore.ctyun.cn/doc/store/sdk/java/objectOperation/listObjects.html 

         操作中有任何问题可以私信或者在评论区中留言!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值