AmazonS3 for java

Posted 李肖峰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AmazonS3 for java相关的知识,希望对你有一定的参考价值。

官方文档:https://docs.aws.amazon.com/zh_cn/sdk-for-java/v1/developer-guide/welcome.html

 

感谢大神分享https://blog.csdn.net/u012147490/article/details/53097459

 

Amazon S3是一种云上的存储服务器,其功能仅在于存储。和普通的服务器不同,它没有操作界面,连一般的SSH命令登录功能都没有。和它打交道的话,一种办法是用它的管理界面,另一种是借助其编程接口。

Amazon S3 特意内置了着重于简易性和稳健性的最小功能集。以下是 Amazon S3 服务的一些优势:

创建存储桶 – 创建和命名存储数据的存储桶。存储桶是 Amazon S3 中用于数据存储的基础容器。

在存储桶中存储数据 – 在存储桶中存储无限量的数据。可将所需数量的对象上传到 Amazon S3 存储桶。每个数据元可包含最多 5 TB 的数据。使用开发人员分配的唯一密钥存储和检索每个对象。

下载数据 – 下载您的数据或允许其他人进行下载。随时下载您的数据或允许其他人执行相同的操作。

权限 - 对于要在您的 Amazon S3 存储桶中上传或下载数据的其他人员,您可以授予其访问权限或拒绝其访问。将上传和下载的许可授予三种类型的用户。身份验证机制可帮助确保数据安全,以防未授权访问。

标准接口 – 使用基于标准的 REST 和 SOAP 接口,它们可与任何 Internet 开发工具包搭配使用。

Note 
HTTP 上的 SOAP 支持已弃用,但是仍可在 HTTPS 上使用。对于 SOAP 将不支持新 Amazon S3 功能。我们建议您使用 REST API 或 AWS 开发工具包。

什么是Amazon S3?

使用 MSI 安装程序安装 AWS CLI (Windows)

名词和术语 
AWS Account:Amazon Web Service Account, 一般一个公司会申请一个帐户,可以认为管理员帐户。

IAM User:一般AWS只有少数人掌握,为了操作的方式,添加子帐户称为IAM帐户,每个帐户有不同的权限。无论是AWS还是IAM帐户,都有一个Access Key ID和一个Secret Key。在Amazon Web 管理界面上登录时使用帐户名,而用编程接口交互时都用的是Access Key ID和Secret Key,其中ID是16个字符,Secret是40个字节。

存储桶

存储桶是 Amazon S3 中用于存储数据元的容器。每个数据元都储存在一个存储桶中。例如,如果名为 photos/puppy.jpg 的数据元存储在 johnsmith 存储桶中,则可使用 URL http://johnsmith.s3.amazonaws.com/photos/puppy.jpg 对该数据元进行寻址

存储桶有以下几种用途:组织最高等级的 Amazon S3 命名空间、识别负责存储和数据传输费用的账户、在访问控制中发挥作用以及用作使用率报告的汇总单位。

Access Control:S3上的Object默认是不能public访问的,这意味着,你上传一个Object的Key=photos/puppy.jpg,并不能直接通过http://johnsmith.s3.amazonaws.com/photos/puppy.jpg 直接访问,会提示Access Denied,只要在设置权限(ACL或Policy之后才可以访问)。

对象

数据元是 Amazon S3 中存储的基本实体。数据元由数据元数据和元数据组成。数据部分对 Amazon S3 不透明。元数据是一组描述数据元的名称-值对。其中包括一些默认元数据(如上次修改日期)和标准 HTTP 元数据(如 Content-Type)。您还可以在存储对象时指定自定义元数据。

在存储桶中,数据元将由密钥(名称)和版本 ID 进行唯一地标识。有关详细信息,请参阅密钥和版本控制。

密钥是指存储桶中数据元的唯一标识符。存储桶内的每个数据元都只能有一个密钥。由于将存储桶、密钥和版本 ID 组合在一起可唯一地标识每个数据元,可将 Amazon S3 视为一种“存储桶 + 密钥 + 版本”与数据元本身间的基本数据映射。将 Web 服务终端节点、存储桶名、密钥和版本(可选)组合在一起,可唯一地寻址 Amazon S3 中的每个数据元。例如,在 URL http://doc.s3.amazonaws.com/2006-03-01/AmazonS3.wsdl 中,“doc”是存储桶的名称,而“2006-03-01/AmazonS3.wsdl”是密钥。

常用操作

选择AWS 开发工具包 

解压后所有文件夹下的jar包 

介绍到这里,直接贴代码

//申明变量

    /**
    * keyID
     */
    public static String accessKeyID = "accessKeyID";

    /**
     * key
     */
    public static String secretKey = "secretKey";

    /**
     * 以理解为一个很大的磁储硬盘,其容量以T为单位
     */
    public static String bucketName = "bucketName";

    /**
     * 上传文件地址
     */
    public static String localPath = "E:XXX/XXX.JPG";

    /**
     * 存储新对象的键
     */
    public static String s3Path = "amazonS3";

    //创建Amazon S3对象
    AWSCredentials credentials;
    AmazonS3 s3Client;
    credentials = new BasicAWSCredentials(accessKeyID, secretKey);
    s3Client = new AmazonS3Client(credentials);
    //设置区域 
    Region cnnorth1 = Region.getRegion(Regions.CN_NORTH_1);
    s3Client.setRegion(cnnorth1);


    /**
    * 查看所有可用的bucket
    * @param s3Client
     */
    public static void getAllBucket(AmazonS3 s3Client){
        List<Bucket> buckets = s3Client.listBuckets();
        for (Bucket bucket : buckets) {
            System.out.println("Bucket: " + bucket.getName());
        }
    }

    /**
     * 查看bucket下所有的object
     * @param bucketName 存储桶
     */
    public static void getAllBucketObject(AmazonS3 s3Client){
        ObjectListing objects = s3Client.listObjects(bucketName);
        do {
            for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) {
                System.out.println("Object: " + objectSummary.getKey());
            }
            objects = s3Client.listNextBatchOfObjects(objects);
        } while (objects.isTruncated());
    }

    /**
     * amazonS3文件上传
     * @param s3Client 
     * @param bucketName 保存到某个存储桶
     * @param key 保存文件的key (以key-value形式保存)
     * @param file 上传文件
     */
    public static void amazonS3Upload(AmazonS3 s3Client,String bucketName,String key,File file){
        PutObjectResult result=s3Client.putObject(new PutObjectRequest(bucketName, key, file));
        System.out.println("PutObjectResult: "+result.toString());
    }


    /**
     * amazonS3文件下载
     * @param s3Client
     * @param bucketName 下载某个存储桶的数据
     * @param key 下载文件的key
     * @param targetFilePath 下载文件保存地址
     */
    public static void amazonS3Downloading(AmazonS3 s3Client,String bucketName,String key,String targetFilePath){
        S3Object object = s3Client.getObject(new GetObjectRequest(bucketName,key));
        if(object!=null){
            System.out.println("Content-Type: " + object.getObjectMetadata().getContentType());
            InputStream input = null;
            FileOutputStream fileOutputStream = null;
            byte[] data = null;
            try {
                //获取文件流
                input=object.getObjectContent();
                data = new byte[input.available()];
                int len = 0;
                fileOutputStream = new FileOutputStream(targetFilePath);
                while ((len = input.read(data)) != -1) {
                    fileOutputStream.write(data, 0, len);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                if(fileOutputStream!=null){
                    try {
                        fileOutputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(input!=null){
                    try {
                        input.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    /**
     * 文件删除
     * @param s3Client
     * @param bucketName 删除文件所在存储桶
     * @param key 删除文件key
     */
    public static void amazonS3DeleteObject(AmazonS3 s3Client,String bucketName,String key){
        s3Client.deleteObject(bucketName, key);
    }

    /**
     * 删除存储桶
     * @param s3Client
     * @param bucketName 需要删除的存储桶
     */
    public static void amazonS3DeleteBucket(AmazonS3 s3Client,String bucketName){
        s3Client.deleteBucket(bucketName);
    }

    //在文件比较大的时候,有必要用多线程上传。(未测试)
    TransferManager tm = new TransferManager(s3Client);  
    TransferManagerConfiguration conf = tm.getConfiguration();  

    int threshold = 4 * 1024 * 1024;  
    conf.setMultipartUploadThreshold(threshold);  
    tm.setConfiguration(conf);  

    Upload upload = tm.upload(bucketName, s3Path, new File(localPath));  
    TransferProgress p = upload.getProgress();  

    while (upload.isDone() == false)  
    {             
        int percent =  (int)(p.getPercentTransfered());
        Thread.sleep(500);  
    }   

    // 默认添加public权限  
    s3Client.setObjectAcl(bucketName, s3Path, CannedAccessControlList.PublicRead);

 

  • 155
  • 156
  • 157

我也是刚刚使用,不详细的地方,请大家在API中查看





以上是关于AmazonS3 for java的主要内容,如果未能解决你的问题,请参考以下文章

java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理(代码片段

导入com.amazonaws.services.s3.AmazonS3ClientBuilder无法解析

如何在 Toad for Oracle 中使用自定义代码片段?

Java错题

codeblock代码片段

AWS S3工具类