AWS存储S3上传、下载、预签名url

本文介绍了如何使用Java编程与AWSS3服务交互,包括创建预签名URL上传文件、获取对象和管理元数据,展示了S3Client、Presigner和Metadata的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package bingsign;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Path;
import java.time.Duration;
import java.util.Map;

import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.core.ResponseBytes;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
import software.amazon.awssdk.services.s3.model.GetUrlRequest;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.PutObjectResponse;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest;
import software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest;

/**
 *
 * @author chenwei
 * https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/example_s3_GetObject_section.html
 * @version S3, v2.0 2024/4/10 15:48
 **/

//        <!-- 添加 AWS SDK for Java V2 的 S3 依赖 -->
//        <dependency>
//            <groupId>software.amazon.awssdk</groupId>
//            <artifactId>s3</artifactId>
//            <version>2.17.115</version>
//        </dependency>

@Slf4j
public class S3 {

    private static String accessKey  = "-----";
    private static String secretKey  = "-----";
    private static String region     = "-----";
    private static String bucketName = "------";


    public static void main(String[] args) throws IOException {
        getURL("kyx-otc/25befe0dfaa84c0ea7599a34bd7aeef31698889840553.mp4");
        upload("saas/555555.jar");
        Map<String, String> metadata = Maps.newHashMap();
        metadata.put("fileName","kkk.jar");
        String presignedGetUrl = createPresignedGetUrl("saas/88888.jar", metadata);
        File file = new File("D:\\apache-maven-3.8.6\\lib\\guice-4.2.2-no_aop.jar");
        usePresignedUrlPut(presignedGetUrl, file, metadata);
        getObjectBytes("saas/88888.jar");
    }

    /**
     * 生成授权url
     * 文档地址:https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/PresignedUrlUploadObject.html
     * 代码示例地址:https://docs.aws.amazon.com/AmazonS3/latest/userguide/example_s3_Scenario_PresignedUrl_section.html
     * @param keyName
     * @return
     */
    public static String createPresignedGetUrl(String keyName, Map<String, String> metadata) {

        S3Presigner presigner = S3Presigner.builder().region(Region.of(region)).credentialsProvider(
                StaticCredentialsProvider.create(AwsBasicCredentials.create(accessKey, secretKey))).build();

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

        PutObjectPresignRequest presignRequest = PutObjectPresignRequest.builder()
                .signatureDuration(Duration.ofMinutes(10))  // The URL expires in 10 minutes.
                .putObjectRequest(objectRequest)
                .build();

        PresignedPutObjectRequest presignedRequest = presigner.presignPutObject(presignRequest);
        String myURL = presignedRequest.url().toString();
        System.out.println(myURL);
        System.out.println(presignedRequest.url().toExternalForm());
        return presignedRequest.url().toExternalForm();
    }

    public static void upload(String keyName) throws IOException {

        AwsBasicCredentials awsCreds = AwsBasicCredentials.create(accessKey, secretKey);
        StaticCredentialsProvider credsProvider = StaticCredentialsProvider.create(awsCreds);

        S3Client s3Client = S3Client.builder()
                .region(Region.of(region))
                .credentialsProvider(credsProvider)
                .build();

        Map<String, String> metadata = Maps.newHashMap();
        metadata.put("namssssse","mmm.jar");

        File file = new File("D:\\apache-maven-3.8.6\\lib\\commons-cli-1.4.jar");
        PutObjectRequest putObjectRequest = PutObjectRequest.builder()
                .bucket(bucketName)
                .key(keyName)
                .metadata(metadata)
                .build();
        try {
            PutObjectResponse response = s3Client.putObject(putObjectRequest, RequestBody.fromFile(file));
            System.out.println("File uploaded successfully. ETag: " + response.eTag());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            s3Client.close();
        }
    }

    /**
     * 预签名url上传文件
     * 文档地址:https://docs.aws.amazon.com/AmazonS3/latest/userguide/example_s3_Scenario_PresignedUrl_section.html
     * @param presignedUrlString 上传的url
     * @param fileToPut 文件内容
     * @param metadata
     */
    public static void usePresignedUrlPut(String presignedUrlString, File fileToPut, Map<String, String> metadata) {

        HttpRequest.Builder requestBuilder = HttpRequest.newBuilder();
        metadata.forEach((k, v) -> requestBuilder.header("x-amz-meta-" + k, v));

        HttpClient httpClient = HttpClient.newHttpClient();
        try {
            final HttpResponse<Void> response = httpClient.send(requestBuilder.uri(new URL(presignedUrlString).toURI())
                            .PUT(HttpRequest.BodyPublishers.ofFile(Path.of(fileToPut.toURI())))
                            .build(), HttpResponse.BodyHandlers.discarding());
            System.out.println(response);
        } catch (URISyntaxException | InterruptedException | IOException e) {
            e.printStackTrace();
        }
    }



    /**
     * 获取下载的url链接,需要权限
     * @param keyName
     */
    public static void getURL(String keyName) {
        try {
            S3Client s3Client = S3Client.builder().region(Region.of(region)).credentialsProvider(
                            StaticCredentialsProvider.create(AwsBasicCredentials.create(accessKey, secretKey)))
                    .build();
            GetUrlRequest request = GetUrlRequest.builder()
                    .bucket(bucketName)
                    .key(keyName)
                    .build();

            URL url = s3Client.utilities().getUrl(request);
            System.out.println("=====" + url);
        } catch (S3Exception e) {
            System.err.println(e.awsErrorDetails().errorMessage());
        }
    }

    /**
     * 读取文件为字节数组
     * @param keyName
     * @return
     */
    public static byte[] getObjectBytes(String keyName) throws IOException {
        try {

            S3Client s3Client = S3Client.builder().region(Region.of(region)).credentialsProvider(
                            StaticCredentialsProvider.create(AwsBasicCredentials.create(accessKey, secretKey)))
                    .build();
            GetObjectRequest objectRequest = GetObjectRequest
                    .builder()
                    .key(keyName)
                    .bucket(bucketName)
                    .build();

            ResponseBytes<GetObjectResponse> objectBytes = s3Client.getObjectAsBytes(objectRequest);
            Map<String, String> metadata = objectBytes.response().metadata();
            System.out.println(metadata);
            byte[] data = objectBytes.asByteArray();
//            // Write the data to a local file.
//                        File myFile = File.createTempFile("kkkkkkkkkkkkk",".jar");
//                        System.out.println(myFile.getAbsolutePath());
//                        OutputStream os = new FileOutputStream(myFile);
//                        os.write(data);
//                        System.out.println("Successfully obtained bytes from an S3 object");
//                        os.close();
            return data;
        } catch (Exception ex) {
            ex.printStackTrace();
            throw ex;
        }
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值