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校验文件是否正确上传  

分片上传文件到s3对象存储minio_上传