美文网首页
使用Amazon S3接口云存储

使用Amazon S3接口云存储

作者: 会点代码的大叔 | 来源:发表于2017-10-19 16:04 被阅读1444次

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

Amazon S3介绍

Amazon S3,也叫AWS S3全称是:Amazon Simple Storage Service

官网介绍

Amazon S3 是专为从任意位置存储和检索任意数量的数据而构建的对象存储,这些数据包括来自网站和移动应用程序、公司应用程序的数据以及来自 IoT 传感器或设备的数据。

简单一句话,AWS S3是一个可以存放文件的地方,并且很可靠,我们可以通过程序对文件进行上传、下载、删除、遍历等操作。

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

文件存放

  • FTP:/xxx/yyy/zzz.txt
  • AWS:/xxx/yyy/zzz.txt,在AWS S3中,这个叫做key

权限控制

  • FTP:用户名、密码
  • AWS:accessKey和secretKey,这个一般是基础设施的伙伴搭建好环境之后告知的,可以看做用户名密码

根目录

  • FTP:使用用户名登录进去之后的目录
  • AWS:bucket

目录结构

  • 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>

常量定义

package com.taikang.aws.aws_demo;

public class AppTest{
    
    //测试环境
    final String ENDPOINT = "http://IP:port";
    final String accessKey = "xxxxx";
    final String secretKey = "yyyyy";
    final String bucket_name = "bucket";
}

遍历文件

package com.taikang.aws.aws_demo;

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();
        } 
    }
    
    /**
     * 根据bucket和key进行文件的查找
     */
    @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();
        } 
    }
}

上传文件

package com.taikang.aws.aws_demo;


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);  //可以设置一些属性,如公司码 = 1
            metadata.addUserMetadata("salecom", salecom);
            metadata.addUserMetadata("contno", contno);
            metadata.addUserMetadata("recordid", recordid);
            
            FileInputStream fi = new FileInputStream(file);  
            
            //这里用managecom/salecom/filename作为文件的key,相当bucketName是一个根目录,创建了一级目录managecom和二级目录salecom,再放进去了一个文件
            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);  //可以设置一些属性,如公司码 = 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();
        } 
    }
}

删除文件

package com.taikang.aws.aws_demo;

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文件中进行配置。
  2. 继续踩... ...

相关文章

网友评论

      本文标题:使用Amazon S3接口云存储

      本文链接:https://www.haomeiwen.com/subject/jkzuuxtx.html