Amazon s3 sdk for java2.x 最新api的简单使用

这篇具有很好参考价值的文章主要介绍了Amazon s3 sdk for java2.x 最新api的简单使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

创建存储桶

登录亚马逊控制台 查找服务“S3” 进入存储桶创建页面;

点击 “创建存储桶”进入创建页面;

获取密钥ID和密钥

点击右上方账户信息在下拉菜单中选择 “安全凭证”(Security credentials)进入我的安全凭证页面;

下滑找到 “访问密钥”标签  点击右侧  “创建访问密钥”按钮;

步骤一: “访问密钥最佳实践和替代方案” 选择适合自己的方案

步骤二:“设置描述标签”可不填

步骤三 “检索访问密钥“

关闭屏蔽公共访问权限

点击创建的存储桶名称进入详情页面后点击“权限”标签

找到 “屏蔽公共访问权限” 点击下方 “编辑” 按钮

取消勾选“阻止所有公开访问”然后点击下方 “保存更改” 按钮;在弹出的确认框中输入“确认”后点击“确认”按钮即可生效。

创建存储桶访问策略

点击创建的存储桶名称进入详情页面后点击“权限”标签

找到存储桶策略 -> 点击右侧“编辑”

创建如下访问策略

代码示例

        首先导入依赖

        工具类

国内使用s3的坑点: 

亚马逊中国区,必须进行ICP 备案,申请开发80或443端口,否则是不能通过网址直接访问s3内部对象的。


备注:以下操作基于您已有AWS账户;

需要获取:存储桶名称、所选区域、密钥ID和密钥;

创建存储桶

  • 登录亚马逊控制台 查找服务“S3” 进入存储桶创建页面;

software.amazon.awssdk,aws,java

点击 “创建存储桶”进入创建页面;

  1. 输入存储桶名称 、选择区域;

software.amazon.awssdk,aws,java

        2. 其他设置保持默认即可;

        3. 点击 “创建存储桶”,即可完成存储桶的创建;

获取密钥ID和密钥

点击右上方账户信息在下拉菜单中选择 “安全凭证”(Security credentials)进入我的安全凭证页面;

software.amazon.awssdk,aws,java

下滑找到 “访问密钥”标签  点击右侧  “创建访问密钥”按钮;

software.amazon.awssdk,aws,java

  1. 进入创建访问密钥之后

步骤一: “访问密钥最佳实践和替代方案” 选择适合自己的方案

  •  勾选下方复选框
  • 点击下一步;

software.amazon.awssdk,aws,java

步骤二:“设置描述标签”可不填

  • 点击 “创建访问密钥”按钮即可创建密钥;

software.amazon.awssdk,aws,java

步骤三 “检索访问密钥“

  1. 点击“下载.csv文件“ 保存密钥ID和密钥
  2. 注意:请保存好下载的.csv文件,离开此页面后“密钥”将没有地方获取查看;

software.amazon.awssdk,aws,java

关闭屏蔽公共访问权限

点击创建的存储桶名称进入详情页面后点击“权限”标签

software.amazon.awssdk,aws,java

找到 “屏蔽公共访问权限” 点击下方 “编辑” 按钮

software.amazon.awssdk,aws,java

取消勾选“阻止所有公开访问”然后点击下方 “保存更改” 按钮;在弹出的确认框中输入“确认”后点击“确认”按钮即可生效。

创建存储桶访问策略

点击创建的存储桶名称进入详情页面后点击“权限”标签

software.amazon.awssdk,aws,java

  1. 找到存储桶策略 -> 点击右侧“编辑”

software.amazon.awssdk,aws,java文章来源地址https://www.toymoban.com/news/detail-830192.html

  1. 创建如下访问策略

{
    "Version": "2012-10-17",
    "Id": "GetImgAndPdf",
    "Statement": [
        {
            "Sid": "GetImgAndPdf123",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws-cn:s3:::所创建存储桶名称/*"
        }
    ]
}

代码示例

        首先导入依赖

    <dependencyManagement>        
        <dependencies>
            <!-- aws s3 -->
            <dependency>
                <groupId>software.amazon.awssdk</groupId>
                <artifactId>bom</artifactId>
                <version>${awsjavasdk.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

<dependencies>
<!-- amazon s3 -->
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>s3</artifactId>
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>kms</artifactId>
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>s3control</artifactId>
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>s3-transfer-manager</artifactId>
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk.crt</groupId>
            <artifactId>aws-crt</artifactId>
            <version>0.24.0</version>
        </dependency>
</dependencies>

        工具类

package com.trainingos.file.utils;

import com.trainingos.common.util.StringUtils;
import com.trainingos.common.util.file.FileTypeUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.apache.http.entity.ContentType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.services.s3.*;
import software.amazon.awssdk.services.s3.model.*;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;
import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest;

import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;

/**
 * @Description 亚马逊文件上传工具类
 * @Author ajie
 **/
@Slf4j
public class FileS3Utils {

/**
     * 密钥ID
     */
    @Value("${aws.s3.accessKeyId}")
    private String accessKeyId;
    /**
     * 密钥
     */
    @Value("${aws.s3.secretKey}")
    private String secretKey;

    /*@Value("${aws.s3.s3Uri}")
    private String s3Uri;*/
    /**
     * 存储桶名字
     */
    @Value("${aws.s3.bucket}")
    private String bucketName;
    /**
     * 地区节点
     */
    @Value("${aws.s3.region}")
    private String regionCode;
    /**
     * 资源映射前缀
     */
    @Value("${aws.s3.path}")
    private String filePathPrefix;

    public static String S3_ACCESS_KEY_ID = null;

    public static String S3_SECRET_KEY = null;

    //public static String S3_URI = null;

    public static String S3_BUCKET = null;

    public static String S3_REGION = null;

    public static String S3_PATH_PREFIX = null;


    /**
     * 初始化
     */
    @PostConstruct
    public void init() {
        S3_ACCESS_KEY_ID = accessKeyId;
        S3_SECRET_KEY = secretKey;
        //S3_URI = s3Uri;
        S3_BUCKET = bucketName;
        S3_REGION = regionCode;
        S3_PATH_PREFIX = filePathPrefix;
    }

    /**
     * S3客户端对象
     */
    private static S3Client s3Client;

    public static S3TransferManager transferManager;

    /**
     * 预签名对象
     */
    private static S3Presigner s3Presigner;


    /**
     * 获取S3客户端对象
     *
     * @return S3Client
     */
    public static synchronized S3Client getS3Client() {
        if (null == s3Client) {
            s3Client = S3Client.builder()
                    .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(S3_ACCESS_KEY_ID, S3_SECRET_KEY)))
                    //.endpointConfiguration(new AwsClientBuilder.EndpointConfiguration(hostName, region))  // 如果有endpoint,可以用这个,这个和withRegion(Region)不能一起使用
                    //.withPathStyleAccessEnabled(true)  // 如果配置了S3域名,就需要加这个进行路径访问,要不然会报AccessKey不存在的问题
                    .region(Region.of(S3_REGION))
                    .build();
        }

        return s3Client;
    }



    /**
     * 上传大文件 高级API
     * @return
     */
    private static synchronized S3TransferManager getTransferManager(){
        if(null == transferManager){
            S3AsyncClient s3AsyncClient =
                    S3AsyncClient.crtBuilder()
                            .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(S3_ACCESS_KEY_ID, S3_SECRET_KEY)))
                            .region(Region.of(S3_REGION))
                            //.targetThroughputInGbps(20.0)
                            //.minimumPartSizeInBytes(8 * MB)
                            .build();

            transferManager =
                    S3TransferManager.builder()
                            .s3Client(s3AsyncClient)
                            .build();
        }
        return transferManager;
    }

    /**
     * 获取预签名对象
     *
     * @return
     */
    public static synchronized S3Presigner getS3PreSigner() {
        if (null == s3Presigner) {
            s3Presigner = S3Presigner.builder()
                    // 凭证
                    .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(S3_ACCESS_KEY_ID, S3_SECRET_KEY)))
                    //.endpointOverride(URI.create(S3_URI))
                    // 服务配置
                    //.serviceConfiguration(S3Configuration.builder().checksumValidationEnabled(false).pathStyleAccessEnabled(true).build())
                    // 区域
                    .region(Region.of(S3_REGION))
                    .build();
        }
        return s3Presigner;
    }

    /**
     * 上传文件
     *
     * @param s3
     * @param bucketName
     * @param awsFilePrefix aws资源映射前缀
     * @param file
     * @param catalog
     * @return
     * @throws IOException
     */
    public static String uploadPublicFile(S3Client s3, String bucketName, String awsFilePrefix, MultipartFile file, String catalog) throws IOException {
        // 生成新文件名
        String fileName = FileUploadUtils.extractFilename(file);
        try {
            String keyName = awsFilePrefix + catalog + "/" + fileName;
            log.info("keyName===》 {} ", keyName);

            String contentType = FileTypeUtils.getFileType(fileName);
            log.info("文件类型===》 {} ", contentType);

            // 使用PutObjectRequest来设置附加的值
            PutObjectRequest putObjectRequest = PutObjectRequest.builder()
                    .bucket(bucketName)
                    .key(keyName)
                    .contentType(contentType)
                    .contentLength(file.getSize())
                    .acl(ObjectCannedACL.PUBLIC_READ)
                    .build();

            // 上传文件
            s3.putObject(putObjectRequest, RequestBody.fromBytes(file.getBytes()));
            log.info("======上传成功=======》 {} ", catalog + "/" + fileName);
            return catalog + "/" + fileName;
        } catch (S3Exception | IOException e) {
            log.info("上传文件:", e);
            throw new IOException(e.getMessage(), e);
        }
    }

   

    /**
     * 预览 有效时间为1天
     *
     * @param key 文件地址  桶中文件全路径
     * @return
     */
    private static String getPreSignatureUrl(S3Presigner s3Presigner, String bucketName, String key) throws Exception {
        String preSignatureUrl = "";
        try {
            GetObjectRequest getObjectRequest = GetObjectRequest.builder()
                    .bucket(bucketName)
                    .key(key)
                    .build();

            //设置预签名URL可访问时间 1天
            GetObjectPresignRequest getObjectPresignRequest = GetObjectPresignRequest.builder()
                    .signatureDuration(Duration.ofDays(1))
                    .getObjectRequest(getObjectRequest)
                    .build();

            PresignedGetObjectRequest presignedGetObjectRequest = s3Presigner.presignGetObject(getObjectPresignRequest);

            preSignatureUrl = String.valueOf(presignedGetObjectRequest.url());
        } catch (Exception e) {
            log.info("生成预签名URL失败,异常: ", e);
            throw new Exception(e.getMessage(), e);
        }

        return preSignatureUrl;
    }


    /**
     * 检查对象是否存在
     *
     * @param s3Client s3客户端
     * @param key      文件在桶中的全路径地址
     * @return
     */
    public static boolean checkIfObjectExists(S3Client s3Client, String bucketName, String key) {
        try {
            HeadObjectRequest headObjectRequest = HeadObjectRequest.builder()
                    .bucket(bucketName)
                    .key(key)
                    .build();

            s3Client.headObject(headObjectRequest);
            return true; // 对象存在
        } catch (NoSuchKeyException e) {
            return false; // 对象不存在
        } catch (S3Exception e) {
            log.info("Error checking if object exists: ", e);
            return false; // 其他错误
        }
    }


    /**
     * 流的方式上传文件到s3桶
     *
     * @param s3Client
     * @param bucketName
     * @param key
     * @param file
     */
    public static void uploadFileStream(S3Client s3Client, String bucketName, String key, File file) {
        try {
            FileInputStream fileInputStream = new FileInputStream(file);

            PutObjectRequest objectRequest = PutObjectRequest.builder()
                    .bucket(bucketName)
                    .key(key)
                    .build();

            // 使用 RequestBody.fromInputStream 方法将文件流上传到 S3
            s3Client.putObject(objectRequest, RequestBody.fromInputStream(fileInputStream, file.length()));
            System.out.println("File uploaded to S3 successfully.");

        } catch (Exception e) {
            System.err.println("Error uploading file to S3: " + e.getMessage());
        }
    }


    /**
     * 获取桶中某目录下所有文件
     *
     * @param s3Client
     * @param bucketName
     * @param prefix     指定前缀,例如文件夹路径
     * @return
     */
    public static List<S3Object> listFilesInBucket(S3Client s3Client, String bucketName, String prefix) {
        ListObjectsV2Request listObjectsRequest = ListObjectsV2Request.builder()
                .bucket(bucketName)
                .prefix(prefix)
                .build();

        ListObjectsV2Response response = s3Client.listObjectsV2(listObjectsRequest);
        return response.contents();
    }


    /**
     * 上传对象
     */
//    public static void main(String[] args){
//
//        try{
//            Long start = System.currentTimeMillis();
//            String baseUrl = "upload/images/common/";
//
//            //File file = new File("C://Users//阿杰//Pictures//微信图片_20220106110701.png");
//            File file = new File("C://Users//阿杰//Videos//《历史关头——红色纪念馆之旅》第二集:星星之火,可以燎原.mp4");
//
//            boolean b = checkIfObjectExists(getS3Client(), "《历史关头——红色纪念馆之旅》第二集:星星之火,可以燎原.mp4");
//            if(b){
//                log.info("============文件已存在=====");
//                return;
//            }
//            //multipartUpload(baseUrl + "/《历史关头——红色纪念馆之旅》第二集:星星之火,可以燎原.mp4",file);
//
//            //MultipartFile multipartFile = getMultipartFile(file);
//
//            //String address = uploadPublicFile(baseUrl, multipartFile);
//            log.info("===========上传完成=====用时:{}",(double)(System.currentTimeMillis()-start)/1000);
//            //log.info("=========文件地址=====》 {} ", address);
//
//            //String upload = FileUploadUtils.upload("D:/wenjian/project" + File.separator + "png", multipartFile);
//            //log.info("=========文件地址=====》 {} ", upload);
//
//            log.info("================================================");
//
//            //String preview = getPreSignatureUrl(baseUrl + "2023/11/06/《历史关头——红色纪念馆之旅》第二集:星星之火,可以燎原_20231106150748A001.mp4");
//            //log.info("=========文件预览地址=====》 {} ", preview);
//
//            //getURL(baseUrl + "《历史关头——红色纪念馆之旅》第二集:星星之火,可以燎原.mp4");
//
//            //===================================================
//        }catch (Exception e){
//            log.info("============",e);
//        }
//    }


    /**
     * file 转 MultipartFile
     *
     * @param file
     * @return
     */
    public static MultipartFile converFileToMultipartFile(File file) throws IOException {
        InputStream inputStream = new FileInputStream(file);
        return new MockMultipartFile(file.getName(), file.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream);
    }




    /**
     * 转换 MultipartFile 为 File 对象
     *
     * @param multipartFile
     * @return
     * @throws IOException
     */
    public static File convertMultipartFileToFile(MultipartFile multipartFile) throws IOException {
        File file = new File(Objects.requireNonNull(multipartFile.getOriginalFilename()));
        try (OutputStream os = new FileOutputStream(file)) {
            os.write(multipartFile.getBytes());
        }
        return file;
    }


    private static final long PART_SIZE = 100 * 1024 * 1024; // 设置文件分段大小 100 M

    /**
     * 计算分段数量
     */
    public static long getPartNumber(long fileLength) {
        if (fileLength % PART_SIZE == 0) {
            return fileLength / PART_SIZE;
        } else {
            return fileLength / PART_SIZE + 1;
        }
    }

    private static void multipartUpload(S3Client s3Client, String bucketName, String objectKey, File file) {
        CreateMultipartUploadRequest createMultipartUploadRequest = CreateMultipartUploadRequest.builder()
                .bucket(bucketName)
                .key(objectKey)
                .build();

        CreateMultipartUploadResponse response = s3Client.createMultipartUpload(createMultipartUploadRequest);
        String uploadId = response.uploadId();
        try {
            FileInputStream fis = new FileInputStream(file);
            List<CompletedPart> completedParts = new ArrayList<>();
            final long fileLength = file.length();
            final long partNumber = getPartNumber(fileLength);
            log.info("multipartUpload fileLength={}, partNumber={},uploadId={}", fileLength, partNumber, uploadId);
            for (int i = 1; i <= partNumber; i++) {
                final byte[] bytes = fis.readNBytes((int) PART_SIZE);
                //String md5 = new String(Base64.encodeBase64(DigestUtils.md5(bytes)));
                UploadPartRequest uploadPartRequest = UploadPartRequest.builder()
                        .bucket(bucketName)
                        .key(objectKey)
                        .uploadId(uploadId)
                        .partNumber(i)
                        //.contentMD5(md5)
                        .build();
                final RequestBody requestBody = RequestBody.fromBytes(bytes);
                UploadPartResponse uploadPartResponse = s3Client.uploadPart(uploadPartRequest, requestBody);
                String eTag = uploadPartResponse.eTag();
                CompletedPart part = CompletedPart.builder().partNumber(i).eTag(eTag).build();
                completedParts.add(part);
            }

            CompletedMultipartUpload completedMultipartUpload = CompletedMultipartUpload.builder()
                    .parts(completedParts)
                    .build();

            CompleteMultipartUploadRequest completeMultipartUploadRequest =
                    CompleteMultipartUploadRequest.builder()
                            .bucket(bucketName)
                            .key(objectKey)
                            .uploadId(uploadId)
                            .multipartUpload(completedMultipartUpload)
                            .build();

            s3Client.completeMultipartUpload(completeMultipartUploadRequest);
        } catch (Exception e) {
            log.error("S3 multipartUpload fail!", e);
            // 停止正在进行的分段上传,清理已上传分段
            s3Client.abortMultipartUpload(AbortMultipartUploadRequest.builder()
                    .bucket(bucketName)
                    .key(objectKey)
                    .uploadId(uploadId)
                    .build());
        }

    }


    /*public static void main(String[] args) {
        Long start = System.currentTimeMillis();
        // 设置所在的AWS Region
        Region region = Region.of(S3_REGION); // 根据您的需求更改Region

        // 创建 S3 客户端
        S3Client s3 = S3Client.builder().credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(S3_ACCESS_KEY_ID, S3_SECRET_KEY))).region(region).build();

        // 定义所使用的存储桶和文件键值
        String bucketName = "nxbvideo"; // 请替换为您要使用的存储桶名称
        String key = "《历史关头——红色纪念馆之旅》第二集:星星之火,可以燎原.mp4"; // 请替换为您要上传的文件的键值

        // 定义本地文件路径
        Path filePath = Paths.get("C://Users//阿杰//Videos//《历史关头——红色纪念馆之旅》第二集:星星之火,可以燎原.mp4"); // 请替换为您要上传的本地文件路径

        // 开始分段上传
        String uploadId = initiateMultipartUpload(s3, bucketName, key);

        // 选择每个分段的大小(100MB),可以根据需要调整分段大小
        long partSize = 100 * 1024 * 1024;

        // 分割文件并上传每个部分
        List<CompletedPart> completedParts = uploadParts(s3, bucketName, key, filePath, partSize,uploadId);
        System.out.println("completedParts 分了==========>"+completedParts.size());

        // 完成分段上传
        completeMultipartUpload(s3, bucketName, key, uploadId, completedParts);

        log.info("===========上传完成=====用时:{}",(double)(System.currentTimeMillis()-start)/1000);
        // 关闭 S3 客户端
        s3.close();
    }*/

    // 初始化分段上传
    public static String initiateMultipartUpload(S3Client s3, String bucketName, String key) {
        CreateMultipartUploadResponse response = s3.createMultipartUpload(
                CreateMultipartUploadRequest.builder()
                        .bucket(bucketName)
                        .key(key)
                        .build()
        );
        return response.uploadId();
    }

    // 分割文件并上传每个部分
    public static List<CompletedPart> uploadParts(S3Client s3, String bucketName, String key, Path filePath, long partSize, String uploadId) {
        List<CompletedPart> completedParts = new ArrayList<>();

        try {
            long filePosition = 0;
            long contentLength = filePath.toFile().length();

            for (int partNumber = 1; filePosition < contentLength; partNumber++) {
                long remainingBytes = contentLength - filePosition;
                long byteCount = Math.min(partSize, remainingBytes);

                UploadPartRequest uploadPartRequest = UploadPartRequest.builder()
                        .bucket(bucketName)
                        .key(key)
                        .uploadId(uploadId)
                        .partNumber(partNumber)
                        .contentLength(byteCount)
                        .build();

                UploadPartResponse response = s3.uploadPart(
                        uploadPartRequest,
                        RequestBody.fromFile(filePath)
                );

                completedParts.add(CompletedPart.builder()
                        .partNumber(partNumber)
                        .eTag(response.eTag())
                        .build());

                filePosition += byteCount;
            }


            return completedParts;
        } catch (Exception e) {
            System.err.println("Multipart upload failed: " + e.getMessage());
            s3.abortMultipartUpload(AbortMultipartUploadRequest.builder()
                    .bucket(bucketName)
                    .key(key)
                    .uploadId(uploadId)
                    .build());
            return null;
        }
    }

    // 中止分段上传
    public static void abortMultipartUpload(S3Client s3, String bucketName, String key, String uploadId) {
        s3.abortMultipartUpload(AbortMultipartUploadRequest.builder()
                .bucket(bucketName)
                .key(key)
                .uploadId(uploadId)
                .build());
        System.out.println("Multipart upload aborted.");
    }

    // 续传分段
    public static void resumeMultipartUpload(S3Client s3, String bucketName, String key, Path filePath, long partSize, String uploadId, List<CompletedPart> completedParts) {
        // 重新初始化分段上传
        uploadId = initiateMultipartUpload(s3, bucketName, key);

        // 检查哪些分段已经上传
        long partNumber = completedParts.size() + 1;
        long filePosition = completedParts.stream()
                .mapToLong(part -> part.partNumber())
                .sum() * partSize;

        try {
            long contentLength = filePath.toFile().length();

            for (; filePosition < contentLength; partNumber++) {
                long remainingBytes = contentLength - filePosition;
                long byteCount = Math.min(partSize, remainingBytes);

                UploadPartResponse response = s3.uploadPart(
                        UploadPartRequest.builder()
                                .bucket(bucketName)
                                .key(key)
                                .uploadId(uploadId)
                                .partNumber((int) partNumber)
                                .contentLength(byteCount)
                                .build(),
                        RequestBody.fromFile(filePath)
                );

                completedParts.add(CompletedPart.builder()
                        .partNumber((int) partNumber)
                        .eTag(response.eTag())
                        .build());

                filePosition += byteCount;
            }

            // 完成续传的分段上传
            completeMultipartUpload(s3, bucketName, key, uploadId, completedParts);
        } catch (Exception e) {
            System.err.println("Multipart upload failed: " + e.getMessage());
            abortMultipartUpload(s3, bucketName, key, uploadId);
        }
    }

    // 完成分段上传
    public static void completeMultipartUpload(S3Client s3, String bucketName, String key, String uploadId, List<CompletedPart> completedParts) {
        CompleteMultipartUploadResponse response = s3.completeMultipartUpload(
                CompleteMultipartUploadRequest.builder()
                        .bucket(bucketName)
                        .key(key)
                        .uploadId(uploadId)
                        .multipartUpload(CompletedMultipartUpload.builder().parts(completedParts).build())
                        .build()
        );
        System.out.println("Multipart upload completed. ETag: " + response.eTag());

        // 因为在分段上传过程中,单独的每个分段并不包含文件的完整 Metadata。
        // 在完成上传之后,使用 CopyObjectRequest 设置文件类型
        // 创建 Metadata 对象并设置文件类型
        /*Map<String, String> metadata = new HashMap<>();
        metadata.put("Content-Type", "application/zip");
        CopyObjectRequest copyObjectRequest = CopyObjectRequest.builder()
                .copySource(bucketName + "/" + key)
                .destinationBucket(bucketName)
                .destinationKey(key)
                .metadataDirective(MetadataDirective.REPLACE) // 覆盖现有元数据
                .metadata(metadata)
                .build();

        s3.copyObject(copyObjectRequest);
        System.out.println("Multipart upload completed. Content-Type set to application/zip.");*/
    }


    // 分片上传
    /*public static void main(String[] args) {
        String bucketName = S3_BUCKET;
        String key = "upload/images/common/《历史关头——红色纪念馆之旅》第二集:星星之火,可以燎原.mp4"; // 文件在 S3 中的键
        String filePathString = "C://Users//阿杰//Videos//《历史关头——红色纪念馆之旅》第二集:星星之火,可以燎原.mp4"; // 本地文件路径

        // 创建 S3 客户端
        S3Client s3 = S3Client.builder()
                .region(Region.of(S3_REGION)) // 设置您的 S3 存储桶所在的区域
                .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(S3_ACCESS_KEY_ID, S3_SECRET_KEY)))
                .build();

        // 指定要上传的本地文件路径
        Path filePath = Path.of(filePathString);

        // 设置分段大小
        final long PART_SIZE = 50 * 1024 * 1024; // 每个分段的大小为 50MB


        // 创建 InitiateMultipartUploadRequest 请求
        CreateMultipartUploadRequest createRequest = CreateMultipartUploadRequest.builder()
                .bucket(bucketName)
                .key(key)
                .build();

        // 初始化分段上传
        CreateMultipartUploadResponse createResponse = s3.createMultipartUpload(createRequest);

        // 获取文件大小
        long contentLength = filePath.toFile().length();

        // 计算分段数量
        long partCount = (contentLength + PART_SIZE - 1) / PART_SIZE;

        // 创建一个线程池
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        try {
            List<Future<CompletedPart>> futures = new ArrayList<>();

            // 逐个上传文件的分段
            for (int i = 1; i <= partCount; i++) {
                long filePosition = (i - 1) * PART_SIZE;
                long partSize = Math.min(PART_SIZE, contentLength - filePosition);

                // 开启线程上传分段
                int finalI = i;
                Future<CompletedPart> future = executorService.submit(() -> {
                    UploadPartRequest uploadRequest = UploadPartRequest.builder()
                            .bucket(bucketName)
                            .key(key)
                            .uploadId(createResponse.uploadId())
                            .partNumber(finalI)
                            .build();

                    // 读取文件分段内容
                    RequestBody requestBody = RequestBody.fromFile(filePath);

                    // 上传分段
                    UploadPartResponse uploadPartResponse = s3.uploadPart(uploadRequest, requestBody);
                    return CompletedPart.builder()
                            .partNumber(finalI)
                            .eTag(uploadPartResponse.eTag())
                            .build();
                });

                futures.add(future);
            }

            List<CompletedPart> completedParts = new ArrayList<>();
            for (Future<CompletedPart> future : futures) {
                completedParts.add(future.get());
            }

            // 完成分段上传
            CompleteMultipartUploadRequest completeRequest = CompleteMultipartUploadRequest.builder()
                    .bucket(bucketName)
                    .key(key)
                    .uploadId(createResponse.uploadId())
                    .multipartUpload(CompletedMultipartUpload.builder()
                            .parts(completedParts)
                            .build())
                    .build();

            s3.completeMultipartUpload(completeRequest);

            System.out.println("Multipart upload completed.");

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭 S3 客户端和线程池
            s3.close();
            executorService.shutdown();
        }
    }*/


    // 上传大文件
    /*public static String uploadFile(S3TransferManager transferManager, String bucketName,
                                    String baseDir, MultipartFile file, String catalog){

        // 生成新文件名
        String fileName = FileUploadUtils.extractFilename(file);

        String keyName = baseDir + catalog + "/" + fileName;
        log.info("生成的文件路径===》 {} ", keyName);

        try{
            UploadFileRequest uploadFileRequest =
                    UploadFileRequest.builder()
                            .putObjectRequest(b -> b.bucket(bucketName).key(keyName))
                            .addTransferListener(LoggingTransferListener.create())
                            //.source(file.)
                            .build();

            FileUpload fileUpload = transferManager.uploadFile(uploadFileRequest);

            CompletedFileUpload uploadResult = fileUpload.completionFuture().join();
            String s = uploadResult.response().eTag();
            return s;
        }catch (Exception e){
            log.info("======",e);
        }
        return "";
    }*/

    /**
     * 上传大文件
     * @param transferManager
     * @param bucketName
     * @param key
     * @param filePath
     * @return
     */
    /*public String uploadFile(S3TransferManager transferManager, String bucketName,
                             String key, String filePath) {
        UploadFileRequest uploadFileRequest =
                UploadFileRequest.builder()
                        .putObjectRequest(b -> b.bucket(bucketName).key(key))
                        .addTransferListener(LoggingTransferListener.create())
                        .source(Paths.get(filePath))
                        .build();

        FileUpload fileUpload = transferManager.uploadFile(uploadFileRequest);

        CompletedFileUpload uploadResult = fileUpload.completionFuture().join();
        return uploadResult.response().eTag();
    }*/

}

国内使用s3的坑点: 

亚马逊中国区,必须进行ICP 备案,申请开发80或443端口,否则是不能通过网址直接访问s3内部对象的。

到了这里,关于Amazon s3 sdk for java2.x 最新api的简单使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [ 云计算 | AWS ] Java 应用中使用 Amazon S3 进行存储桶和对象操作完全指南

    本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。 本文同步于个人公众号:【 云计算洞察 】 更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文: [ 云计算 | AWS 实践 ] Java 应用中使用 Amazon S3 进行存储桶

    2024年02月11日
    浏览(34)
  • [ 云计算 | AWS 实践 ] Java 应用中使用 Amazon S3 进行存储桶和对象操作完全指南

    本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。 本文同步于个人公众号:【 云计算洞察 】 更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文: [ 云计算 | AWS 实践 ] Java 应用中使用 Amazon S3 进行存储桶

    2024年02月08日
    浏览(36)
  • [ 云计算 | AWS 实践 ] 使用 Java 检查指定的密钥是否存在于给定的 Amazon S3 存储桶中

    本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。 本文同步于个人公众号:【 云计算洞察 】 更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文: [ 云计算 | AWS 实践 ] Java 应用中使用 Amazon S3 进行存储桶

    2024年02月05日
    浏览(51)
  • 使用Ceph对象存储的Amazon S3接口(基于nautilus版本)

    Ceph是一个分布式存储系统,提供了多种数据存储方式,包括对象存储。Amazon S3是一个流行的对象存储服务,Ceph提供了Amazon S3接口的兼容性,使得Ceph可以作为一个云存储解决方案。 分片上传接口是Amazon S3接口中的一个重要功能,它允许将大文件拆分成小的分片上传,降低了上

    2024年02月06日
    浏览(37)
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹

    本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。 本文同步于个人公众号:【 云计算洞察 】 更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文: [ 云计算 | AWS 实践 ] Java 应用中使用 Amazon S3 进行存储桶

    2024年02月08日
    浏览(45)
  • Java 亚马逊Amazon spapi对接开发,java Sdk,授权和接口访问步骤详细说明

    确认是否收到通过sp-api开发人员资料申请。   创建一个策略,我们建议您将 IAM 策略命名为 SellingPartnerAPI 。     开发商名称:任意字符 开发者id :accessKeyId 客户端相关信息,包含clientId和clientSecret。 1.8.1访问需要的参数和数据如图 参数 说明 样例 roleArn 角色Arn,在角色中

    2024年02月03日
    浏览(31)
  • Amazon S3简介

    这段时间来到了某大数据平台,做平台技术底座封装和一些架构等等,有结构化数据也有非结构数据,涉及到很多技术,自己也私下花时间去研究了很多,有很多纯技术类的还是需要梳理并记录,巩固以及复习。一个项目用到了几个云存储,其中就包括Amazon S3,这边就学习并

    2023年04月08日
    浏览(24)
  • 深入Amazon S3:实战指南

    Amazon S3(Simple Storage Service)是AWS(Amazon Web Services)提供的一项强大的云存储服务,广泛用于存储和检索各种类型的数据。本篇实战指南将深入介绍如何在实际项目中充分利用Amazon S3的功能,包括存储桶的创建、对象的管理、权限控制、版本控制、日志记录等方面的实际操作

    2024年01月23日
    浏览(36)
  • Amazon S3 服务15岁生日快乐!

    2021年3月14日,作为第一个发布的服务,Amazon S3 服务15周岁啦!在中国文化里,15岁是个临界点,是从“舞勺之年”到“舞象之年”的过渡。相信对于 Amazon S3 和其他的云服务15周岁也将是其迎接更加美好未来的全新起点。 亚马逊云科技开发者社区为开发者们提供全球的开发技

    2024年02月02日
    浏览(29)
  • 音频编辑SDK Audio DJ Studio API for .NET

    Audio DJ Studio API for .NET  is a .NET class developed by MultiMedia Soft that makes it easy to add sound playback and mixing capabilities to your applications; thanks to the integration with DirectShow codecs and with the BASS library, both adding decoding capabilities for the most common sound formats such as MP3, WAV, Ogg Vorbis and many others, Audio D

    2024年02月13日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包