Java利用aws对s3的操作

1.配置S3信息并进行连接

package com.demo.common.utils.aws;

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @ClassName:
 * @Description: 链接s3
 * @Author: Wzp
 * @Date: 2022/3/30
 * @Version 1.0
 **/
@Configuration
public class AwsConfig {
    @Value("${s3.awsAccessKey}")
    private String awsAccessKey;
    @Value("${s3.awsSecretKey}")
    private String awsSecretKey;

    @Bean
    public AmazonS3 amazonS3() {
        BasicAWSCredentials awsCreds = new BasicAWSCredentials(awsAccessKey, awsSecretKey);
        AmazonS3 amazonS3 = AmazonS3ClientBuilder.standard().withRegion(Regions.AP_SOUTHEAST_1).withCredentials(new AWSStaticCredentialsProvider(awsCreds)).build();
        return amazonS3;
    }
}

2.对s3桶的基本操作

package com.demo.common.utils.aws;

import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.*;
import com.amazonaws.services.s3.model.analytics.AnalyticsConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName:
 * @Description: s3桶常用操作
 * @Author: Wzp
 * @Date: 2022/3/29
 * @Version 1.0
 **/
@Component
public class AwsS3Bucket {

    @Autowired
    public AmazonS3 s3;

    /**
     * s3桶名称
     */
    @Value("${s3.bucketName}")
    private  String bucketName;
    /**
     * s3区域
     */
    private String region = Regions.AP_SOUTHEAST_1.getName();

    /**
     * 列出所有的s3桶
     */
    public void listBuckets() {
        List<Bucket> buckets = s3.listBuckets();
        buckets.forEach(item -> {
            System.out.println(item.toString());
        });
    }

    /**
     * 创建一个s3桶-默认
     */
    public void createBucketBase() {
        Bucket bucket = s3.createBucket(bucketName);
        System.out.println(bucket.toString());
    }

    /**
     * 创建一个s3桶-带参数
     */
    public void createBucketWithParams() {
        //指定名称和区域
        CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName, region);
        //是否启用对象锁-启用后,阻止删除对象
        createBucketRequest.setObjectLockEnabledForBucket(true);
        Bucket bucket = s3.createBucket(createBucketRequest);
        System.out.println(bucket.toString());
    }

    /**
     * 删除一个s3桶
     */
    public void deleteBucket() {
        DeleteBucketRequest deleteBucketRequest = new DeleteBucketRequest(bucketName);
        s3.deleteBucket(deleteBucketRequest);
        System.out.println("delete bucket success");
    }

    /**
     * s3桶配置
     */
    public void configBucket() {
        /**
         * 加速配置
         */
        BucketAccelerateConfiguration bucketAccelerateConfiguration = new BucketAccelerateConfiguration(BucketAccelerateStatus.Enabled);
        s3.setBucketAccelerateConfiguration(bucketName, bucketAccelerateConfiguration);
        /**
         * 权限配置
         */
        //公共访问权限
        SetBucketAclRequest setBucketAclRequest = new SetBucketAclRequest(bucketName, CannedAccessControlList.Private);
        s3.setBucketAcl(setBucketAclRequest);
        //访问控制列表
        AccessControlList accessControlList = new AccessControlList();
        accessControlList.setRequesterCharged(true);
        accessControlList.setOwner(null);
        SetBucketAclRequest setBucketAclRequest2 = new SetBucketAclRequest(bucketName, accessControlList);
        s3.setBucketAcl(setBucketAclRequest2);
        /**
         * 分析配置
         */
        AnalyticsConfiguration analyticsConfiguration = new AnalyticsConfiguration();
        analyticsConfiguration.setId(null);
        SetBucketAnalyticsConfigurationRequest setBucketAnalyticsConfigurationRequest = new SetBucketAnalyticsConfigurationRequest(bucketName, analyticsConfiguration);
        s3.setBucketAnalyticsConfiguration(setBucketAnalyticsConfigurationRequest);
        /**
         * 生命周期配置
         */
        BucketLifecycleConfiguration bucketLifecycleConfiguration = new BucketLifecycleConfiguration();
        List<BucketLifecycleConfiguration.Rule> rules = new ArrayList();
        //需要预先制定规则
        BucketLifecycleConfiguration.Rule rule = new BucketLifecycleConfiguration.Rule().withId(null);
        rules.add(rule);
        bucketLifecycleConfiguration.setRules(rules);
        SetBucketLifecycleConfigurationRequest setBucketLifecycleConfigurationRequest = new SetBucketLifecycleConfigurationRequest(bucketName, bucketLifecycleConfiguration);
        s3.setBucketLifecycleConfiguration(setBucketLifecycleConfigurationRequest);
        /**
         * 加密配置
         * 当对象存储在s3时默认是加密的
         */
        SetBucketEncryptionRequest setBucketEncryptionRequest = new SetBucketEncryptionRequest();
        setBucketEncryptionRequest.setBucketName(bucketName);
        ServerSideEncryptionConfiguration serverSideEncryptionConfiguration = new ServerSideEncryptionConfiguration();
        //同样,需要预先制定规则
        serverSideEncryptionConfiguration.setRules(null);
        setBucketEncryptionRequest.setServerSideEncryptionConfiguration(serverSideEncryptionConfiguration);
        s3.setBucketEncryption(setBucketEncryptionRequest);
        /**
         * 版本控制配置
         */
        BucketVersioningConfiguration bucketVersioningConfiguration = new BucketVersioningConfiguration();
        bucketVersioningConfiguration.setMfaDeleteEnabled(true);
        bucketVersioningConfiguration.setStatus(BucketVersioningConfiguration.ENABLED);
        SetBucketVersioningConfigurationRequest setBucketVersioningConfigurationRequest = new SetBucketVersioningConfigurationRequest(bucketName, bucketVersioningConfiguration);
        s3.setBucketVersioningConfiguration(setBucketVersioningConfigurationRequest);

        /**
         * 为s3指定一个策略-s3的策略是唯一的
         */
        s3.setBucketPolicy(null);
        /**
         * 日志记录配置
         */
        s3.setBucketLoggingConfiguration(null);
        /**
         * 通知配置
         */
        s3.setBucketNotificationConfiguration(null);
        /**
         * 复制配置
         */
        s3.setBucketReplicationConfiguration(null);
        /**
         * 标签配置
         */
        s3.setBucketTaggingConfiguration(null);
        /**
         * 静态网站托管配置
         */
        s3.setBucketWebsiteConfiguration(null);
        /**
         * 指标配置
         */
        s3.setBucketMetricsConfiguration(null);

    }

}

3.对S3桶中文件的基本操作

package com.demo.common.utils.aws;


import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.*;
import java.util.List;

/**
 * @ClassName:
 * @Description: s3桶文件的常用操作
 * @Author: Wzp
 * @Date: 2022/3/29
 * @Version 1.0
 **/
@Slf4j
@Component
public class AwsS3File {
    @Autowired
    private AmazonS3 s3;

    /**
     * s3桶名称
     */
    @Value("${s3.bucketName}")
    private String bucketName;
    /**
     * 上传到s3桶后的文件名,key如果是带路径的则会自动创建路径,格式为 文件夹名+/+文件名称
     */
    private String key = "test/test";
    /**
     * 本地文件
     */
    private String localFilePath = "/Users/yz/Documents/";
    /**
     * 列出一个s3桶内的文件
     */
    public void listFiles() {
        //可以加入文件名前缀当作搜索条件
        String prefix = "";
        ObjectListing objectListing = s3.listObjects(bucketName);
        List<S3ObjectSummary> s3ObjectSummaryList = objectListing.getObjectSummaries();
        s3ObjectSummaryList.forEach(item -> {
            //文件路径及名称-如果是文件夹,以"/"标识路径
            System.out.print(item.getKey() + ",");
            //文件UUID
            System.out.println(item.getETag());
        });
    }

    /**
     * 上传一个文件到s3桶
     * 注意1:如果key相同,则替换
     * 注意2:如果key是一个层次路径,那么s3会自动创建相应文件夹
     * @param file
     * @param content 指定存放的目录
     */
    public String uploadFile(File file, String content) {
        String filePath = file.getAbsolutePath();
        String key = content + "/" + filePath.substring(filePath.lastIndexOf("/") + 1,filePath.indexOf("."));
        log.info("上传文件到s3的请求参数为:file:{},content:{},key:{}",file,content,key);
        try{
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, file);
            //设置权限属性等-非必需
//        putObjectRequest.setCannedAcl(CannedAccessControlList.PublicRead);
            //上传
            PutObjectResult putObjectResult = s3.putObject(putObjectRequest);
            log.info("获取上传后文件路径地址");
            String fileUrl = getUrlFromS3(key);
            return fileUrl;
        }catch (Exception e){
            log.info("执行上传和获取文件链接异常:{}",e.getMessage());
        }
        return null;
    }
    /**
     * @param @param  remoteFileName 文件名
     * @param @return
     * @param @throws IOException    设定文件
     * @return String    返回类型
     * @throws
     * @Title: getUrlFromS3
     * @Description: 获取文件的url
     */
    public String getUrlFromS3(String key) throws IOException {
        try {
            GeneratePresignedUrlRequest httpRequest = new GeneratePresignedUrlRequest(bucketName, key);
            String url = s3.generatePresignedUrl(httpRequest).toString();//临时链接
            return url;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 从s3桶删除一个文件
     * 注意:如果删除的是最后一个文件,那么,上层文件夹也会被同时删除
     */
    public void deleteFile() {
        s3.deleteObject(bucketName, key);
    }

    /**
     * 获取一个文件
     *
     * @throws IOException
     */
    public S3Object downloadFile() throws IOException {
        //获取文件
        S3Object s3Object = s3.getObject(bucketName, key);
        //s3文件输入流,继承了FilterInputStream
        S3ObjectInputStream s3ObjectInputStream = s3Object.getObjectContent();
        //文件属性等数据
        ObjectMetadata objectMetadata = s3Object.getObjectMetadata();
        //文件的key-可以用来获取文件名
        System.out.println(s3Object.getKey());
        //桶名
        System.out.println(s3Object.getBucketName());
        System.out.println(s3Object.getRedirectLocation());
        System.out.println(s3Object.getTaggingCount());
        return s3Object;
    }

    /**
     * 获取一个文件,并打印出来
     * @param content 目录
     * @param remoteFileName 需要下载的文件名
     * @throws IOException
     */
    public void downloadFileWithPrint(String content, String remoteFileName) throws IOException {
        String key = content + "/" + remoteFileName;
        S3Object s3Object = s3.getObject(bucketName, key);
        S3ObjectInputStream s3ObjectInputStream = s3Object.getObjectContent();
        //如果是txt文件,可以把内容打印出来
        StringBuffer stringBuffer = new StringBuffer();
        byte[] buffer = new byte[1024];
        while ((s3ObjectInputStream.read(buffer)) != -1) {
            stringBuffer.append(new String(buffer, "UTF-8"));
        }
        s3ObjectInputStream.close();
        System.out.println(stringBuffer.toString().trim());
    }

    /**
     * 下载文件并保存到本地
     * @param content 目录
     * @param remoteFileName 需要下载的文件名
     * @throws IOException
     */
    public void downloadFileWithSave(String content, String remoteFileName) throws IOException {
        String key = content + "/" + remoteFileName;
        S3Object s3Object = s3.getObject(bucketName, key);
        S3ObjectInputStream s3ObjectInputStream = s3Object.getObjectContent();
        OutputStream os = null;
        try {
            //文件名
            String fileName = s3Object.getKey().substring(s3Object.getKey().lastIndexOf("/"));
//            String fileName = s3Object.getKey();
            os = new FileOutputStream(new File(localFilePath + "s3/" + fileName));
            byte[] buffer = new byte[1024];
            while ((s3ObjectInputStream.read(buffer)) != -1) {
                os.write(buffer);
            }
            os.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
            if (s3ObjectInputStream != null) {
                s3ObjectInputStream.close();
            }
        }
    }

    /**
     * 复制一个文件
     * 比较简单,就是复制,可以选择原文件的版本
     */
    public void copyFile() {
        String sourceBucketName = bucketName;
        String sourceKey = key;
        String sourceVersionId = null;
        String destinationBucketName = bucketName;
        String destinationKey = key;
        CopyObjectRequest copyObjectRequest = new CopyObjectRequest(sourceBucketName, sourceKey, sourceVersionId, destinationBucketName, destinationKey);
        CopyObjectResult copyObjectResult = s3.copyObject(copyObjectRequest);
        System.out.println(copyObjectResult.toString());
    }

}

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
注:下文中的 *** 代表文件名中的版本号。 # 【aws-java-sdk-s3-***.jar中文-英文对照文档.zip】 中包含: 中文-英文对照文档:【aws-java-sdk-s3-***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【aws-java-sdk-s3-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【aws-java-sdk-s3-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【aws-java-sdk-s3-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【aws-java-sdk-s3-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: aws-java-sdk-s3-***.jar中文-英文对照文档.zip,java,aws-java-sdk-s3-***.jar,com.amazonaws,aws-java-sdk-s3,***,com.amazonaws.auth,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,amazonaws,aws,sdk,s3,中文-英文对照API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【aws-java-sdk-s3-***.jar中文-英文对照文档.zip】,再解压其中的 【aws-java-sdk-s3-***-javadoc-API文档-中文(简体)-英语-对照版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-s3</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'com.amazonaws', name: 'aws-java-sdk-s3', version: '***' Gradle (Short): implementation 'com.amazonaws:aws-java-sdk-s3:***' Gradle (Kotlin): implementation("com.amazonaws:aws-java-sdk-s3:***") ``` # 含有的 Java package(包)(此处仅列举3个): ``` com.amazonaws.auth com.amazonaws.auth.policy.actions com.amazonaws.auth.policy.conditions ...... ``` # 含有的 Java class(类)(此处仅列举3个): ``` com.amazonaws.auth.AwsChunkedEncodingInputStream com.amazonaws.auth.policy.actions.S3Actions com.amazonaws.auth.policy.conditions.S3ConditionFactory ...... ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值