aws服務從入門到精通|s3文件的操作

s3 簡介(什么是s3)

Amazon Simple Storage Service 是互聯網存儲解決方案榆骚。該服務旨在降低開發(fā)人員進行網絡規(guī)模級計算的難度亿笤。
Amazon S3 提供了一個簡單 Web 服務接口,可用于隨時在 Web 上的任何位置存儲和檢索任何數量的數據流码。此服務讓所有開發(fā)人員都能訪問同一個具備高擴展性咱旱、可靠性更鲁、安全性和快速價廉的數據存儲基礎設施, Amazon 用它來運行其全球的網站網絡。此服務旨在為開發(fā)人員帶來最大化的規(guī)模效益魏保。

S3的基本概念

  • 存儲桶:

    存儲桶是 Amazon S3 中用于存儲對象的容器熬尺。每個對象都儲存在一個存儲桶中。

  • 對象:

    對象是 Amazon S3 中存儲的基本實體谓罗。對象由對象數據和元數據組成粱哼。

  • 鍵:

    鍵是指存儲桶中對象的唯一標識符。存儲桶內的每個對象都只能有一個鍵檩咱。由于將存儲桶揭措、鍵和版本 ID 組合在一起可唯一地標識每個對象,可將 Amazon S3 視為一種“存儲桶 + 鍵 + 版本”與對象本身間的基本數據映射刻蚯。將 Web 服務終端節(jié)點绊含、存儲桶名、鍵和版本 (可選) 組合在一起炊汹,可唯一地尋址 Amazon S3 中的每個對象躬充。例如,在 URL http://doc.s3.amazonaws.com/2006-03-01/AmazonS3.wsdl 中讨便,“doc”是存儲桶的名稱充甚,而“2006-03-01/AmazonS3.wsdl”是鍵

  • 區(qū)域:
    • 美國東部(弗吉尼亞北部)地區(qū) 使用在弗吉尼亞北部的 Amazon S3 服務器
    • 美國東部(俄亥俄)區(qū)域 使用在俄亥俄州哥倫布的 Amazon S3 服務器
    • 美國西部(加利福利亞北部)區(qū)域 使用在加利福尼亞北部的 Amazon S3 服務器
    • 美國西部(俄勒岡)區(qū)域 使用在俄勒岡的 Amazon S3 服務器
    • 加拿大 (中部) 區(qū)域 使用在蒙特利爾的 Amazon S3 服務器
    • 亞太地區(qū)(孟買)區(qū)域 使用在孟買的 Amazon S3 服務器
    • 亞太區(qū)域(首爾) 使用在首爾的 Amazon S3 服務器
    • 亞太區(qū)域(新加坡) 使用在新加坡的 Amazon S3 服務器
    • 亞太區(qū)域(悉尼) 使用在悉尼的 Amazon S3 服務器
    • 亞太區(qū)域(東京) 使用在東京的 Amazon S3 服務器
    • 歐洲(法蘭克福)區(qū)域 使用位于法拉克福的 Amazon S3 服務器
    • 歐洲(愛爾蘭)區(qū)域 使用在愛爾蘭的 Amazon S3 服務器
    • 歐洲 (倫敦) 區(qū)域 使用在倫敦的 Amazon S3 服務器
    • 南美洲(圣保羅)區(qū)域 使用在圣保羅的 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服務中創(chuàng)建用戶伴找,獲取:aws_access_key_id 和aws_secret_access_key
image.png
image.png
image.png
image.png
  • 3傲霸、給改用戶 AmazonS3FullAccess權限


    image.png
  • 4疆瑰、創(chuàng)建可以連接的授權文件

    • 1眉反、linux平臺文件創(chuàng)建路徑:~/.aws/credentials:

    • 2昙啄、windows平臺文件創(chuàng)建路徑: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初始化系統(tǒng)異常", e);
            }
        }
    }
  • 2、創(chuàng)建桶:
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("創(chuàng)建本地文件失敗");
            }
        } catch (IOException e) {
            LOGGER.error("寫入s3文件系統(tǒng)異常:{}" + e);
        }
    }

完整的上傳文件代碼

-1十性、注意:下面代碼的桶是通過s3的控制臺創(chuàng)建叛溢。對象是以dt=XXXX-XX-XX開頭。方便以后使用aws的Athena工具分區(qū)使用劲适。

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初始化系統(tǒng)異常", 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("創(chuàng)建本地文件失敗");
            }
        } catch (IOException e) {
            LOGGER.error("寫入s3文件系統(tǒng)異常:{}" + 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閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異草雕,居然都是意外死亡巷屿,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門墩虹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘱巾,“玉大人,你說我怎么就攤上這事诫钓∨埃” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵尖坤,是天一觀的道長稳懒。 經常有香客問我,道長慢味,這世上最難降的妖魔是什么场梆? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮纯路,結果婚禮上或油,老公的妹妹穿的比我還像新娘。我一直安慰自己驰唬,他們只是感情好顶岸,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叫编,像睡著了一般辖佣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搓逾,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天卷谈,我揣著相機與錄音,去河邊找鬼霞篡。 笑死世蔗,一個胖子當著我的面吹牛,可吹牛的內容都是我干的朗兵。 我是一名探鬼主播污淋,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼余掖!你這毒婦竟也來了寸爆?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎而昨,沒想到半個月后救氯,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡歌憨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年着憨,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片务嫡。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡甲抖,死狀恐怖,靈堂內的尸體忽然破棺而出心铃,到底是詐尸還是另有隱情准谚,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布去扣,位于F島的核電站柱衔,受9級特大地震影響,放射性物質發(fā)生泄漏愉棱。R本人自食惡果不足惜唆铐,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奔滑。 院中可真熱鬧艾岂,春花似錦、人聲如沸朋其。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梅猿。三九已至氓辣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粒没,已是汗流浹背筛婉。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工簇爆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留癞松,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓入蛆,卻偏偏與公主長得像响蓉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哨毁,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內容