|
@@ -1,8 +1,14 @@
|
|
|
package com.fdkankan.fyun.s3;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
+import com.amazonaws.ClientConfiguration;
|
|
|
import com.amazonaws.HttpMethod;
|
|
|
+import com.amazonaws.auth.AWSStaticCredentialsProvider;
|
|
|
+import com.amazonaws.auth.BasicAWSCredentials;
|
|
|
+import com.amazonaws.client.builder.AwsClientBuilder;
|
|
|
+import com.amazonaws.regions.Regions;
|
|
|
import com.amazonaws.services.s3.AmazonS3;
|
|
|
+import com.amazonaws.services.s3.AmazonS3ClientBuilder;
|
|
|
import com.amazonaws.services.s3.model.*;
|
|
|
import com.fdkankan.fyun.constant.FYunTypeEnum;
|
|
|
import com.fdkankan.fyun.face.AbstractFYunFileService;
|
|
@@ -15,6 +21,7 @@ import org.springframework.stereotype.Component;
|
|
|
import org.springframework.util.ObjectUtils;
|
|
|
|
|
|
import java.io.*;
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.net.URL;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
@@ -25,6 +32,20 @@ public class S3FileService extends AbstractFYunFileService {
|
|
|
|
|
|
private Logger log = LoggerFactory.getLogger(this.getClass().getName());
|
|
|
|
|
|
+ public static AmazonS3 amazonS3(){
|
|
|
+ BasicAWSCredentials awsCreds = new BasicAWSCredentials("AKIAWCV5QFZ3ZNELKYUY", "epS5ghyR4LJ7rxk/qJO9ZYh6m9Oz6g5haKDu4yws");
|
|
|
+ ClientConfiguration clientConfiguration = new ClientConfiguration();
|
|
|
+ clientConfiguration.setMaxErrorRetry(4);
|
|
|
+ clientConfiguration.setMaxConnections(100);
|
|
|
+ AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration("test-4dkankan.s3.eu-west-2.amazonaws.com",Regions.EU_WEST_2.getName());
|
|
|
+ return AmazonS3ClientBuilder.standard()
|
|
|
+ .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
|
|
|
+ .withEndpointConfiguration(endpointConfiguration)
|
|
|
+ .withClientConfiguration(clientConfiguration)
|
|
|
+// .withRegion(Regions.EU_WEST_2).
|
|
|
+ .build();
|
|
|
+ }
|
|
|
+
|
|
|
@Autowired
|
|
|
private AmazonS3 s3;
|
|
|
|
|
@@ -343,43 +364,29 @@ public class S3FileService extends AbstractFYunFileService {
|
|
|
|
|
|
@Override
|
|
|
public void restoreFile(String bucket, String objectName, Integer priority){
|
|
|
-// ObjectMetadata objectMetadata = ossClient.getObjectMetadata(bucket, objectName);
|
|
|
-//
|
|
|
-// // 校验Object是否为归档类型Object。
|
|
|
-// StorageClass storageClass = objectMetadata.getObjectStorageClass();
|
|
|
-// if (storageClass == StorageClass.ColdArchive) {
|
|
|
-// // 设置解冻冷归档Object的优先级。
|
|
|
-// // RestoreTier.RESTORE_TIER_EXPEDITED 表示1小时内完成解冻。
|
|
|
-// // RestoreTier.RESTORE_TIER_STANDARD 表示2~5小时内完成解冻。
|
|
|
-// // RestoreTier.RESTORE_TIER_BULK 表示5~12小时内完成解冻。
|
|
|
-// RestoreTier restoreTier = null;
|
|
|
-// switch (priority){
|
|
|
-// case 1 :
|
|
|
-// restoreTier = RestoreTier.RESTORE_TIER_EXPEDITED;
|
|
|
-// break;
|
|
|
-// case 2 :
|
|
|
-// restoreTier = RestoreTier.RESTORE_TIER_STANDARD;
|
|
|
-// break;
|
|
|
-// default:
|
|
|
-// restoreTier = RestoreTier.RESTORE_TIER_BULK;
|
|
|
-// }
|
|
|
-// RestoreJobParameters jobParameters = new RestoreJobParameters(restoreTier);
|
|
|
-// // 配置解冻参数,以设置5小时内解冻完成,解冻状态保持2天为例。
|
|
|
-// // 第一个参数表示保持解冻状态的天数,默认是1天,此参数适用于解冻Archive(归档)与ColdArchive(冷归档)类型Object。
|
|
|
-// // 第二个参数jobParameters表示解冻优先级,只适用于解冻ColdArchive类型Object。
|
|
|
-// RestoreConfiguration configuration = new RestoreConfiguration(1, jobParameters);
|
|
|
-// //开始解冻
|
|
|
-// ossClient.restoreObject(bucket, objectName, configuration);
|
|
|
-//// // 等待解冻完成。
|
|
|
-//// do {
|
|
|
-//// try {
|
|
|
-//// Thread.sleep(1000);
|
|
|
-//// } catch (InterruptedException e) {
|
|
|
-//// e.printStackTrace();
|
|
|
-//// }
|
|
|
-//// objectMetadata = ossClient.getObjectMetadata(bucket, objectName);
|
|
|
-//// } while (!objectMetadata.isRestoreCompleted());
|
|
|
-// }
|
|
|
+ ObjectMetadata objectMetadata = s3.getObjectMetadata(bucket, objectName);
|
|
|
+
|
|
|
+ // 校验Object是否为归档类型Object。
|
|
|
+ StorageClass storageClass = StorageClass.fromValue(objectMetadata.getStorageClass());
|
|
|
+ if (storageClass == StorageClass.Glacier) {
|
|
|
+ Tier restoreTier = null;
|
|
|
+ switch (priority){
|
|
|
+ case 1 :
|
|
|
+ restoreTier = Tier.Expedited;
|
|
|
+ break;
|
|
|
+ case 2 :
|
|
|
+ restoreTier = Tier.Standard;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ restoreTier = Tier.Bulk;
|
|
|
+ }
|
|
|
+ RestoreObjectRequest requestRestore = new RestoreObjectRequest(bucket, objectName, 1);
|
|
|
+ GlacierJobParameters glacierJobParameters = new GlacierJobParameters();
|
|
|
+ glacierJobParameters.setTier(restoreTier);
|
|
|
+ requestRestore.setGlacierJobParameters(glacierJobParameters);
|
|
|
+ //开始解冻
|
|
|
+ s3.restoreObjectV2(requestRestore);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -407,8 +414,8 @@ public class S3FileService extends AbstractFYunFileService {
|
|
|
for (String objectName : objectList) {
|
|
|
objectMetadata = s3.getObjectMetadata(bucket, objectName);
|
|
|
// 校验Object是否为归档类型Object。
|
|
|
- StorageClass storageClass = objectMetadata.getArchiveStatus();
|
|
|
- if (storageClass == StorageClass.) {
|
|
|
+ StorageClass storageClass = StorageClass.fromValue(objectMetadata.getStorageClass());
|
|
|
+ if (storageClass == StorageClass.Glacier) {
|
|
|
// 解冻Object。
|
|
|
RestoreObjectRequest requestRestore = new RestoreObjectRequest(bucket, url, 1);
|
|
|
s3.restoreObjectV2(requestRestore);
|
|
@@ -418,7 +425,26 @@ public class S3FileService extends AbstractFYunFileService {
|
|
|
|
|
|
@Override
|
|
|
public Integer getRestoreFolderProcess(String bucket, String url) {
|
|
|
- return null;
|
|
|
+ ObjectMetadata objectMetadata ;
|
|
|
+
|
|
|
+ List<String> objectList = this.listRemoteFiles(bucket, url);
|
|
|
+ if(CollUtil.isEmpty(objectList)){
|
|
|
+ return 100;
|
|
|
+ }
|
|
|
+ List<String> restoreFileList = new ArrayList<>();
|
|
|
+ for (String objectName : objectList) {
|
|
|
+ objectMetadata = s3.getObjectMetadata(bucket, objectName);
|
|
|
+ if(this.isRestoreCompleted(objectMetadata)){
|
|
|
+
|
|
|
+ restoreFileList.add(objectName);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(objectList.size() <= restoreFileList.size() ){
|
|
|
+ return 100;
|
|
|
+ }
|
|
|
+ BigDecimal rite = new BigDecimal(restoreFileList.size()).divide(new BigDecimal(objectList.size()),2,BigDecimal.ROUND_HALF_UP);
|
|
|
+ BigDecimal multiply = rite.multiply(new BigDecimal(100));
|
|
|
+ return multiply.intValue();
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -444,4 +470,52 @@ public class S3FileService extends AbstractFYunFileService {
|
|
|
|
|
|
return total;
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void copyFileToArchive(String sourceBucketName, String sourcePath, String targetBucketName, String targetPath) {
|
|
|
+ try {
|
|
|
+ List<String> files = listRemoteFiles(sourceBucketName, sourcePath);
|
|
|
+ if (ObjectUtils.isEmpty(files)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ files.stream().forEach(file -> {
|
|
|
+ CopyObjectRequest request = new CopyObjectRequest(sourceBucketName, file, targetBucketName, file.replace(sourcePath, targetPath));
|
|
|
+ request.setStorageClass(StorageClass.Glacier);
|
|
|
+ s3.copyObject(request);
|
|
|
+ });
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("复制文件或目录失败,key:" + sourcePath, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String[] args) {
|
|
|
+
|
|
|
+ AmazonS3 amazonS3 = amazonS3();
|
|
|
+
|
|
|
+ List<String> keyList = new ArrayList<>();
|
|
|
+ boolean flag = true;
|
|
|
+ String nextMaker = null;
|
|
|
+ ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
|
|
|
+ listObjectsRequest.setBucketName("test-4dkankan");
|
|
|
+ listObjectsRequest.setPrefix("test/KJ-t-ekRwoMX8XP");
|
|
|
+ listObjectsRequest.setMaxKeys(200);
|
|
|
+
|
|
|
+ do {
|
|
|
+ listObjectsRequest.setMarker(nextMaker);
|
|
|
+ ObjectListing objectListing = amazonS3.listObjects(listObjectsRequest);
|
|
|
+ List<S3ObjectSummary> objectSummaries = objectListing.getObjectSummaries();
|
|
|
+ List<String> collect = objectSummaries.stream().map(S3ObjectSummary::getKey).collect(Collectors.toList());
|
|
|
+ if (CollUtil.isNotEmpty(collect)) {
|
|
|
+ keyList.addAll(collect);
|
|
|
+ }
|
|
|
+ nextMaker = objectListing.getNextMarker();
|
|
|
+ flag = objectListing.isTruncated();
|
|
|
+ } while (flag);
|
|
|
+
|
|
|
+ keyList.stream().forEach(file -> {
|
|
|
+ CopyObjectRequest request = new CopyObjectRequest("test-4dkankan", file, "test-4dkk-bak", file.replace("test/KJ-t-ekRwoMX8XP", "test/KJ-t-ekRwoMX8XP"));
|
|
|
+ request.setStorageClass(StorageClass.DeepArchive);
|
|
|
+ amazonS3.copyObject(request);
|
|
|
+ });
|
|
|
+ }
|
|
|
}
|