1. 程式人生 > >AmazonS3 使用 AWS SDK for Java

AmazonS3 使用 AWS SDK for Java

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 開發工具包。

名詞和術語
AWS Account:Amazon Web Service Account, 一般一個公司會申請一個帳戶,可以認為管理員帳戶。

IAM User:一般AWS只有少數人掌握,為了操作的方式,新增子帳戶稱為IAM帳戶,每個帳戶有不同的許可權。無論是AWS還是IAM帳戶,都有一個Access Key ID和一個Secret Key。在Amazon Web 管理介面上登入時使用帳戶名,而用程式設計介面互動時都用的是Access Key IDSecret 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”是金鑰。

常用操作

解壓後所有資料夾下的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);

我也是剛剛使用,不詳細的地方,請大家在API中檢視