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 服務器
-
收費價格:
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
-
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ū)使用劲适。
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