1. 程式人生 > >AmazonS3 for java

AmazonS3 for java

stream 下載 bsp lose 管理員 code 如果 static del

官方文檔: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