- 首先要获取天翼云的一些配置信息。
- 要知道账户的access-key (表示访问天翼云存储服务的身份凭证之一,类似于一个“用户名”)。
- 其次是账户的secret-key (表示访问天翼云存储服务的另一个身份凭证,类似于“密码”)。
- 桶对象服务器所在的区域的endpoint (
obs.cn-gdgz1.ctyun.cn
表示你连接的天翼云服务位于广东广州市的区域(Region)。cn-gdgz1
是区域代码,一般是endpoint的值。ctyun.cn
是天翼云的域名。不同区域有不同的 Endpoint 地址,连接时需要确保地址正确。)。 - 桶名称bucket(表示存储桶的名称,用于指定存储的数据位置。)
- 在java项目中引入天翼云所需要的依赖。
-
<!--天翼云依赖--> <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>
- 将天翼云的信息配置在java项目中配置文件中。
# 文件上传 OOS (天翼云) oos: config: access-key: xxxxxxxxxxxx secret-key: xxxxxxxxxxxx endpoint: obs.cn-gdgz1.ctyun.cn bucket: xxxxx
- 创建天翼云的客户端。
@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(); } }
- 创建天翼云对象上传,下载,删除等操作的工具类。
@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); } }
- 还有最重要的一点,一定要让运维人员放开对桶的操作权限以及桶内对象的操作权限,(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()); }
-
- 更多的天翼云文件操作请查看官方文档:天翼云媒体存储 - 产品手册 (ctyun.cn)
https://console.xstore.ctyun.cn/doc/store/sdk/java/objectOperation/listObjects.html
操作中有任何问题可以私信或者在评论区中留言!