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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容