使用Amazon S3接口云存儲

本文主要介紹了如果使用Java操作Amazon S3接口

Amazon S3介紹

Amazon S3牵触,也叫AWS S3全稱是:Amazon Simple Storage Service

官網(wǎng)介紹

Amazon S3 是專為從任意位置存儲和檢索任意數(shù)量的數(shù)據(jù)而構(gòu)建的對象存儲,這些數(shù)據(jù)包括來自網(wǎng)站和移動應(yīng)用程序界轩、公司應(yīng)用程序的數(shù)據(jù)以及來自 IoT 傳感器或設(shè)備的數(shù)據(jù)盐须。

簡單一句話玩荠,AWS S3是一個可以存放文件的地方,并且很可靠贼邓,我們可以通過程序?qū)ξ募M(jìn)行上傳阶冈、下載、刪除塑径、遍歷等操作女坑。

我們可以把AWS S3看成是FTP:

文件存放

  • FTP:/xxx/yyy/zzz.txt
  • AWS:/xxx/yyy/zzz.txt,在AWS S3中统舀,這個叫做key

權(quán)限控制

  • FTP:用戶名匆骗、密碼
  • AWS:accessKey和secretKey,這個一般是基礎(chǔ)設(shè)施的伙伴搭建好環(huán)境之后告知的誉简,可以看做用戶名密碼

根目錄

  • FTP:使用用戶名登錄進(jìn)去之后的目錄
  • AWS:bucket

目錄結(jié)構(gòu)

  • FTP:/xxx/yyy
  • AWS:/xxx/yyy

訪問地址

AWS SDK for Java

官方的SDK for Java:https://aws.amazon.com/cn/sdk-for-java/

Demo:單位連github連了幾天闷串,又上不去了...貼幾個單元測試用例

POM.XML需要引入:

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
</dependency>

常量定義

public class AppTest{
    
    //測試環(huán)境
    final String ENDPOINT = "http://IP:port";
    final String accessKey = "xxxxx";
    final String secretKey = "yyyyy";
    final String bucket_name = "bucket";
}

遍歷文件

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder.EndpointConfiguration;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.ListObjectsV2Request;
import com.amazonaws.services.s3.model.ListObjectsV2Result;
import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectSummary;

/**
 * 遍歷文件
 * 
 * 兩周方法遍歷bucketName下面的所有文件
 * @author liuwei117
 *
 */
public class AWSListTest extends AppTest{
    private static Logger logger = LoggerFactory.getLogger(AWSListTest.class);
    
    @Test
    public void listObject(){
        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        
        ClientConfiguration clientConfig = new ClientConfiguration();
        
        try {
            clientConfig.setProtocol(Protocol.HTTP);
            
            AmazonS3Client conn = new AmazonS3Client(credentials,clientConfig);
            conn.setEndpoint(ENDPOINT);
            
            ObjectListing objects = conn.listObjects(bucket_name);
            do {
                 for (S3ObjectSummary objectSummary : objects.getObjectSummaries()){
                     logger.info("\t"+objectSummary.getKey() + "\t" + objectSummary.getSize() 
                             + "\t" +objectSummary.getOwner() + "\t" +objectSummary.getLastModified().toString());
                     
                 }
            } while (objects.isTruncated());
            
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }
    
    @Test
    public void listObjectWithClientBuilder(){
        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        
        ClientConfiguration clientConfig = new ClientConfiguration();
        
        try {
            clientConfig.setProtocol(Protocol.HTTP);
            
            AmazonS3ClientBuilder builder=  AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(credentials));
            EndpointConfiguration endpointConfiguration = new EndpointConfiguration(ENDPOINT, Regions.AP_SOUTHEAST_1.getName());
            builder.setEndpointConfiguration(endpointConfiguration);
            
                    AmazonS3 conn = builder.build();
            
            ListObjectsV2Request req = new ListObjectsV2Request().withBucketName(bucket_name);
            
            ListObjectsV2Result result;
            
do {
result = conn.listObjectsV2(req);

for (S3ObjectSummary objectSummary : result.getObjectSummaries()) {
    logger.info("\t"+objectSummary.getKey() + "\t" + objectSummary.getSize() 
                             + "\t" +objectSummary.getOwner() + "\t" +objectSummary.getLastModified().toString());
}
} while(result.isTruncated());
            
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }
    
    /**
     * 根據(jù)bucket和key進(jìn)行文件的查找
     */
    @Test
    public void getObjectByKey(){
        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        
        ClientConfiguration clientConfig = new ClientConfiguration();
        
        try {
            clientConfig.setProtocol(Protocol.HTTP);
            
            AmazonS3ClientBuilder builder=  AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(credentials));
            EndpointConfiguration endpointConfiguration = new EndpointConfiguration(ENDPOINT, Regions.AP_SOUTHEAST_1.getName());
            builder.setEndpointConfiguration(endpointConfiguration);
            
    AmazonS3 conn = builder.build();
            
    S3Object object = conn.getObject(new GetObjectRequest(bucket_name, "e0500720170818105659.wav"));
    
    logger.info(object.getKey());
    /*if(object != null ){
        ObjectMetadata metadata = object.getObjectMetadata();
        
        logger.info(metadata.getUserMetaDataOf("managecom"));
        logger.info(metadata.getUserMetaDataOf("salecom"));
        logger.info(metadata.getUserMetaDataOf("contno"));
        logger.info(metadata.getUserMetaDataOf("recordid"));
    }*/
            
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }
}

上傳文件

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.URL;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder.EndpointConfiguration;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;

/**
 * 上傳文件
 * 
 * @author liuwei117
 *
 */
public class AWSUploadTest extends AppTest{
    private static Logger logger = LoggerFactory.getLogger(AWSUploadTest.class);
    
    //本地的一個文件
    private File file = new File("E:" + File.separator + "EliteClient2017060710.log");  
    
    private String managecom = "1" ;
    private String salecom = "1TT" ;
    private String contno = "12345678" ;
    private String recordid = "11111111" ;
    
    //這里做一下目錄分級:上傳的文件放在1/1TT/下面
    private String key = managecom + "/" + salecom + "/" + file.getName();
    
    @Test
    public void UploadObject(){
        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        
        ClientConfiguration clientConfig = new ClientConfiguration();
        
        try {
            clientConfig.setProtocol(Protocol.HTTP);
            
            AmazonS3Client conn = new AmazonS3Client(credentials,clientConfig);
            conn.setEndpoint(ENDPOINT);
            
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(file.length());

            metadata.addUserMetadata("managecom", managecom);  //可以設(shè)置一些屬性惊豺,如公司碼 = 1
            metadata.addUserMetadata("salecom", salecom);
            metadata.addUserMetadata("contno", contno);
            metadata.addUserMetadata("recordid", recordid);
            
            FileInputStream fi = new FileInputStream(file);  
            
            //這里用managecom/salecom/filename作為文件的key,相當(dāng)bucketName是一個根目錄就乓,創(chuàng)建了一級目錄managecom和二級目錄salecom筋遭,再放進(jìn)去了一個文件
            conn.putObject(bucket_name , key , fi , metadata); 
            //conn.putObject(new PutObjectRequest(bucket_name, key, file));
            
            //將上傳了的文件生成一個url連接髓涯,可以直接通過url連接訪問文件
            GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest(bucket_name, key);
            URL url = conn.generatePresignedUrl(urlRequest);
            
            logger.info("[" + key + "]'s url is " + url);
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }
    
    @Test
    public void listObjectWithClientBuilder(){
        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        
        ClientConfiguration clientConfig = new ClientConfiguration();
        
        try {
            clientConfig.setProtocol(Protocol.HTTP);
            
            AmazonS3ClientBuilder builder=  AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(credentials));
            EndpointConfiguration endpointConfiguration = new EndpointConfiguration(ENDPOINT, Regions.AP_SOUTHEAST_1.getName());
            builder.setEndpointConfiguration(endpointConfiguration);
            
                    AmazonS3 conn = builder.build();
    
                    ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(file.length());

            metadata.addUserMetadata("managecom", managecom);  //可以設(shè)置一些屬性,如公司碼 = 1
            metadata.addUserMetadata("salecom", salecom);
            metadata.addUserMetadata("contno", contno);
            metadata.addUserMetadata("recordid", recordid);
            
            FileInputStream fi = new FileInputStream(file);  
            
    conn.putObject(new PutObjectRequest(bucket_name, key, fi , metadata));
            //conn.putObject(new PutObjectRequest(bucket_name, key, file));
            
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }
}

刪除文件

import java.io.File;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder.EndpointConfiguration;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;

/**
 * 遍歷文件
 * @author liuwei117
 *
 */
public class AWSDeleteTest extends AppTest{
    private static Logger logger = LoggerFactory.getLogger(AWSDeleteTest.class);
    
    //本地的一個文件
    private File file = new File("E:" + File.separator + "EliteClient2017060710.log");  
    
    private String managecom = "1" ;
    private String salecom = "1TT" ;
    private String contno = "12345678" ;
    private String recordid = "11111111" ;
    
    //這里做一下目錄分級:上傳的文件放在1/1TT/下面
    //private String key = managecom + "/" + salecom + "/" + file.getName();
    private String key = "1/1TT/11111111";
    @Test
    public void deleteObject(){
        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        
        ClientConfiguration clientConfig = new ClientConfiguration();
        
        try {
            clientConfig.setProtocol(Protocol.HTTP);
            
            AmazonS3Client conn = new AmazonS3Client(credentials,clientConfig);
            conn.setEndpoint(ENDPOINT);
            
            conn.deleteObject(bucket_name , key);
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }
    
    @Test
    public void deleteObjectWithClientBuilder(){
        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        
        ClientConfiguration clientConfig = new ClientConfiguration();
        
        try {
            clientConfig.setProtocol(Protocol.HTTP);
            
            AmazonS3ClientBuilder builder=  AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(credentials));
            EndpointConfiguration endpointConfiguration = new EndpointConfiguration(ENDPOINT, Regions.AP_SOUTHEAST_1.getName());
            builder.setEndpointConfiguration(endpointConfiguration);
            
    AmazonS3 conn = builder.build();
    
    conn.deleteObject(bucket_name , key);
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }
}

遇到的坑

  1. 必須用域名訪問年叮,如果AWS S3的地址沒有綁定域名,也需要在host文件中進(jìn)行配置玻募。
  2. 繼續(xù)踩... ...
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末只损,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子七咧,更是在濱河造成了極大的恐慌跃惫,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艾栋,死亡現(xiàn)場離奇詭異爆存,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蝗砾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門先较,熙熙樓的掌柜王于貴愁眉苦臉地迎上來携冤,“玉大人,你說我怎么就攤上這事闲勺≡兀” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵菜循,是天一觀的道長翘地。 經(jīng)常有香客問我,道長癌幕,這世上最難降的妖魔是什么衙耕? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮勺远,結(jié)果婚禮上橙喘,老公的妹妹穿的比我還像新娘。我一直安慰自己谚中,他們只是感情好渴杆,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宪塔,像睡著了一般磁奖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上某筐,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天比搭,我揣著相機(jī)與錄音,去河邊找鬼南誊。 笑死身诺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抄囚。 我是一名探鬼主播霉赡,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼幔托!你這毒婦竟也來了穴亏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤重挑,失蹤者是張志新(化名)和其女友劉穎嗓化,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谬哀,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡刺覆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了史煎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谦屑。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡驳糯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伦仍,到底是詐尸還是另有隱情结窘,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布充蓝,位于F島的核電站隧枫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谓苟。R本人自食惡果不足惜官脓,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涝焙。 院中可真熱鬧卑笨,春花似錦、人聲如沸仑撞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隧哮。三九已至桶良,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沮翔,已是汗流浹背陨帆。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留采蚀,地道東北人疲牵。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像榆鼠,于是被迫代替她去往敵國和親纲爸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容