本文主要介紹了如果使用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
訪問地址
- FTP:ftp://IP:端口
- AWS:http://域名:端口碉就,也叫ENDPOINT,實際上就是一個連接,如:"http://test.ojstorage.ecm.group.tkuat.com"
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();
}
}
}
遇到的坑
- 必須用域名訪問年叮,如果AWS S3的地址沒有綁定域名,也需要在host文件中進(jìn)行配置玻募。
- 繼續(xù)踩... ...