美文网首页
aws服务从入门到精通|s3文件的操作

aws服务从入门到精通|s3文件的操作

作者: 黑客和白帽子的故事 | 来源:发表于2017-12-26 19:14 被阅读0次

    s3 简介(什么是s3)

    Amazon Simple Storage Service 是互联网存储解决方案。该服务旨在降低开发人员进行网络规模级计算的难度。
    Amazon S3 提供了一个简单 Web 服务接口,可用于随时在 Web 上的任何位置存储和检索任何数量的数据。此服务让所有开发人员都能访问同一个具备高扩展性、可靠性、安全性和快速价廉的数据存储基础设施, Amazon 用它来运行其全球的网站网络。此服务旨在为开发人员带来最大化的规模效益。

    S3的基本概念

    • 存储桶:

      存储桶是 Amazon S3 中用于存储对象的容器。每个对象都储存在一个存储桶中。

    • 对象:

      对象是 Amazon S3 中存储的基本实体。对象由对象数据和元数据组成。

    • 键:

      键是指存储桶中对象的唯一标识符。存储桶内的每个对象都只能有一个键。由于将存储桶、键和版本 ID 组合在一起可唯一地标识每个对象,可将 Amazon S3 视为一种“存储桶 + 键 + 版本”与对象本身间的基本数据映射。将 Web 服务终端节点、存储桶名、键和版本 (可选) 组合在一起,可唯一地寻址 Amazon S3 中的每个对象。例如,在 URL http://doc.s3.amazonaws.com/2006-03-01/AmazonS3.wsdl 中,“doc”是存储桶的名称,而“2006-03-01/AmazonS3.wsdl”是键

    • 区域:
      • 美国东部(弗吉尼亚北部)地区 使用在弗吉尼亚北部的 Amazon S3 服务器
      • 美国东部(俄亥俄)区域 使用在俄亥俄州哥伦布的 Amazon S3 服务器
      • 美国西部(加利福利亚北部)区域 使用在加利福尼亚北部的 Amazon S3 服务器
      • 美国西部(俄勒冈)区域 使用在俄勒冈的 Amazon S3 服务器
      • 加拿大 (中部) 区域 使用在蒙特利尔的 Amazon S3 服务器
      • 亚太地区(孟买)区域 使用在孟买的 Amazon S3 服务器
      • 亚太区域(首尔) 使用在首尔的 Amazon S3 服务器
      • 亚太区域(新加坡) 使用在新加坡的 Amazon S3 服务器
      • 亚太区域(悉尼) 使用在悉尼的 Amazon S3 服务器
      • 亚太区域(东京) 使用在东京的 Amazon S3 服务器
      • 欧洲(法兰克福)区域 使用位于法拉克福的 Amazon S3 服务器
      • 欧洲(爱尔兰)区域 使用在爱尔兰的 Amazon S3 服务器
      • 欧洲 (伦敦) 区域 使用在伦敦的 Amazon S3 服务器
      • 南美洲(圣保罗)区域 使用在圣保罗的 Amazon S3 服务器
    • 收费价格:

      https://amazonaws-china.com/cn/s3/pricing/

    S3的java的基本操作的准备工作

    • 1、导入pom.xml文件:
      <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3 -->
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-s3</artifactId>
        <version>1.11.255</version>
    </dependency>
    
    • 2、在 s3服务中创建用户,获取:aws_access_key_id 和aws_secret_access_key
    image.png image.png image.png image.png
    • 3、给改用户 AmazonS3FullAccess权限


      image.png
    • 4、创建可以连接的授权文件

      • 1、linux平台文件创建路径:~/.aws/credentials:

      • 2、windows平台文件创建路径:C:\Users\Administrator.aws\credentials

      • 3、文件的内容如下:

    [default]
    aws_access_key_id= xxxx
    aws_secret_access_key=xxxx
    

    S3的java的基本操作API

    • 1、获取凭证,初始化连接:
        /***
         * s3初始化方法
         * */
        private static void initS3() {
            if(s3 == null){
                try {
                    AWSCredentials  credentials = new ProfileCredentialsProvider().getCredentials();
                    s3 = AmazonS3Client.builder().withRegion(Regions.US_WEST_2).withCredentials(new AWSStaticCredentialsProvider(credentials)).build();
                } catch (Exception e) {
                    LOGGER.error("s3初始化系统异常", e);
                }
            }
        }
    
    • 2、创建桶:
    String bucketName = "s3-bucket-name"
    s3.createBucket("bucketName ")
    
    • 3、删除桶:
    String bucketName = "s3-bucket-name"
    s3.deleteBucket("bucketName");
    
    • 3、获取bucket的list:
       List<Bucket> buckets = s3.listBuckets();
                for (Bucket bucket: buckets) {
                    System.out.println(bucket.getName());
                }
    
    • 4、上传对象 (文件上传)
    /**
         * 上传文件
         * @throws IOException
         */
        public  static  boolean uploadFile(File file, String bucketName,Date now) throws IOException {
                // 判断s3桶是否存在
                initS3();
            try{
                s3.putObject(new PutObjectRequest(bucketName, FILE_PREFIX+FILE_LINK_STR+DateUtil.parse(now,DateUtil.YYYYMMDD) + LINK_STR + file.getName(), file));
            } catch (Exception e) {
                LOGGER.error("Upload an object to your bucket error:{}" + e);
                return false;
            }
            return true;
        }
    
        public static File createSampleFile(String content,Date now) throws IOException {
            File file = File.createTempFile(DateUtil.parse(now, DateUtil.SXF_TIME), FILE_POSTFIX);
            file.deleteOnExit();
            Writer writer = new OutputStreamWriter(new FileOutputStream(file),CHARSET_NAME);
            writer.write(content);
            writer.close();
            return file;
        }
    
        /**
         * 多线程写文件
         */
        
        public  static void saveFileToS3(String content, String bucketName) {
            try {
                Date now = new Date();
                File tempFile = createSampleFile(content, now);
                if(null!=tempFile){
                    boolean result = uploadFile(tempFile, bucketName, now);
                    if(result){
                        tempFile.delete();
                    }
                }else{
                    LOGGER.info("创建本地文件失败");
                }
            } catch (IOException e) {
                LOGGER.error("写入s3文件系统异常:{}" + e);
            }
        }
    

    完整的上传文件代码

    -1、注意:下面代码的桶是通过s3的控制台创建。对象是以dt=XXXX-XX-XX开头。方便以后使用aws的Athena工具分区使用。

    image.png
    package com.sdk.wifi.yiba.utils.aws.s3;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    import java.util.Date;
    import java.util.List;
    
    import com.amazonaws.services.s3.model.Bucket;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import com.amazonaws.auth.AWSCredentials;
    import com.amazonaws.auth.AWSStaticCredentialsProvider;
    import com.amazonaws.auth.profile.ProfileCredentialsProvider;
    import com.amazonaws.regions.Regions;
    import com.amazonaws.services.s3.AmazonS3;
    import com.amazonaws.services.s3.AmazonS3Client;
    import com.amazonaws.services.s3.model.PutObjectRequest;
    import com.sdk.wifi.yiba.config.Config;
    import com.sdk.wifi.yiba.utils.date.DateUtil;
    
    public class S3Util{
    
        /**
         * 初始化aws文件的服务
         */
        private final static Logger LOGGER = LoggerFactory.getLogger(S3Util.class);
        private static AmazonS3 s3 = null;
        private static final String LINK_STR = "/";
        private static final String FILE_POSTFIX = ".csv";
        private static final String CHARSET_NAME = "UTF-8";
        private static final String FILE_PREFIX = "dt";
        private static final String FILE_LINK_STR = "=";
    
    
    
        /***
         * s3初始化方法
         * */
        private static void initS3() {
            if(s3 == null){
                try {
                    AWSCredentials  credentials = new ProfileCredentialsProvider().getCredentials();
                    s3 = AmazonS3Client.builder().withRegion(Regions.US_WEST_2).withCredentials(new AWSStaticCredentialsProvider(credentials)).build();
                } catch (Exception e) {
                    LOGGER.error("s3初始化系统异常", e);
                }
            }
        }
    
        /**
         * 上传文件
         * @throws IOException
         */
        public  static  boolean uploadFile(File file, String bucketName,Date now) throws IOException {
                // 判断s3桶是否存在
                initS3();
            try{
                s3.putObject(new PutObjectRequest(bucketName, FILE_PREFIX+FILE_LINK_STR+DateUtil.parse(now,DateUtil.YYYYMMDD) + LINK_STR + file.getName(), file));
            } catch (Exception e) {
                LOGGER.error("Upload an object to your bucket error:{}" + e);
                return false;
            }
            return true;
        }
    
        public static File createSampleFile(String content,Date now) throws IOException {
            File file = File.createTempFile(DateUtil.parse(now, DateUtil.SXF_TIME), FILE_POSTFIX);
            file.deleteOnExit();
            Writer writer = new OutputStreamWriter(new FileOutputStream(file),CHARSET_NAME);
            writer.write(content);
            writer.close();
            return file;
        }
    
        /**
         * 多线程写文件
         */
        
        public  static void saveFileToS3(String content, String bucketName) {
            try {
                Date now = new Date();
                File tempFile = createSampleFile(content, now);
                if(null!=tempFile){
                    boolean result = uploadFile(tempFile, bucketName, now);
                    if(result){
                        tempFile.delete();
                    }
                }else{
                    LOGGER.info("创建本地文件失败");
                }
            } catch (IOException e) {
                LOGGER.error("写入s3文件系统异常:{}" + e);
            }
        }
    
    }
    

    参考文档

    http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/Welcome.html
    https://github.com/aws
    https://github.com/aws/aws-sdk-java

    相关文章

      网友评论

          本文标题:aws服务从入门到精通|s3文件的操作

          本文链接:https://www.haomeiwen.com/subject/seyxgxtx.html