import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.TransferManagerBuilder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* 测试s3 sdk分片上传minio
*/
public class S3MinioTest {
AmazonS3 s3;
TransferManager transferManager;
String TEST_BUCKET = "test";
@BeforeEach
public void initMinio() {
String endpoint = "http://172.19.34.30:9000";
String region = "";
String accessKey = "root";
String secretKey = "rootroot";
s3 = AmazonS3ClientBuilder.standard().withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endpoint, region)).withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey))).build();
transferManager = TransferManagerBuilder.standard().withS3Client(s3).build();
if (!s3.doesBucketExistV2(TEST_BUCKET)) {
s3.createBucket(TEST_BUCKET);
}
}
@Test
public void uploadPartTest() {
// 初始化分段上传
String fileKey = "1111";
InitiateMultipartUploadResult initiateMultipartUploadResult = s3.initiateMultipartUpload(new InitiateMultipartUploadRequest(TEST_BUCKET, fileKey));
final String uploadId = initiateMultipartUploadResult.getUploadId();
// 分片上传, split -b 10m -d test_file test_file_
List<PartETag> etags = new ArrayList<>();
String prePath = "d:\\tmp\\test_file_";
for (int i = 0; i < Integer.MAX_VALUE; i++) {
File partFile = new File(prePath + i);
if (!partFile.exists()) {
break;
}
UploadPartResult uploadPartResult = uploadPart(TEST_BUCKET, fileKey, uploadId, i + 1, partFile);
etags.add(uploadPartResult.getPartETag());
}
// 完成分段上传
CompleteMultipartUploadRequest uploadRequest = new CompleteMultipartUploadRequest();
uploadRequest.setUploadId(uploadId);
uploadRequest.setBucketName(TEST_BUCKET);
uploadRequest.setKey(fileKey);
uploadRequest.setPartETags(etags);
CompleteMultipartUploadResult completeMultipartUploadResult = s3.completeMultipartUpload(uploadRequest);
// md5sum 校验文件
}
/**
* @param bucket 对象存储的桶
* @param key 对象存储的key
* @param uploadId 初始化分段上传得到的uploadId
* @param partNumber 分片序号,从1开始
* @param partFile 分片文件
* @return 分片响应
*/
// 分段上传
private UploadPartResult uploadPart(String bucket, String key, String uploadId, int partNumber, File partFile) {
UploadPartRequest partRequest = new UploadPartRequest();
partRequest.setBucketName(bucket);
partRequest.setPartNumber(partNumber);
partRequest.setFile(partFile);
partRequest.setPartSize(partFile.length());
partRequest.setFileOffset(0L);
partRequest.setKey(key);
partRequest.setUploadId(uploadId);
return s3.uploadPart(partRequest);
}
}
md5校验文件是否正确上传