阿里雲OSS學習

 

本文介紹一些OSS經常使用的api使用方法,具體api查看阿里雲官方文檔:https://helpcdn.aliyun.com/document_detail/31817.htmlhtml

轉載一篇阿里雲oss的坑:http://www.javashuo.com/article/p-unywlevw-nb.htmljava

 

阿里雲對象存儲服務(Object Storage Service,簡稱 OSS),是阿里雲提供的海量、安全、低成本、高可靠的雲存儲服務。其數據設計持久性不低於 99.9999999999%(12 個 9),服務設計可用性(或業務連續性)不低於 99.995%。apache

OSS 具備與平臺無關的 RESTful API 接口,您能夠在任何應用、任什麼時候間、任何地點存儲和訪問任意類型的數據。api

您可使用阿里雲提供的 API、SDK 接口或者 OSS 遷移工具輕鬆地將海量數據移入或移出阿里雲 OSS。數據存儲到阿里雲 OSS 之後,您能夠選擇標準存儲(Standard)做爲移動應用、大型網站、圖片分享或熱點音視頻的主要存儲方式,也能夠選擇成本更低、存儲期限更長的低頻訪問存儲(Infrequent Access)和歸檔存儲(Archive)做爲不常常訪問數據的存儲方式。安全

相關概念

  • 存儲類型(Storage Class)

    OSS 提供標準、低頻訪問、歸檔三種存儲類型,全面覆蓋從熱到冷的各類數據存儲場景。其中標準存儲類型提供高可靠、高可用、高性能的對象存儲服務,可以支持頻繁的數據訪問;低頻訪問存儲類型適合長期保存不常常訪問的數據(平均每個月訪問頻率 1 到 2 次),存儲單價低於標準類型;歸檔存儲類型適合須要長期保存(建議半年以上)的歸檔數據,在三種存儲類型中單價最低。詳情請參見存儲類型介紹。服務器

  • 存儲空間(Bucket)

    存儲空間是您用於存儲對象(Object)的容器,全部的對象都必須隸屬於某個存儲空間。存儲空間具備各類配置屬性,包括地域、訪問權限、存儲類型等。您能夠根據實際需求,建立不一樣類型的存儲空間來存儲不一樣的數據。建立存儲空間請參見建立存儲空間。網絡

  • 對象/文件(Object)

    對象是 OSS 存儲數據的基本單元,也被稱爲 OSS 的文件。對象由元信息(Object Meta)、用戶數據(Data)和文件名(Key)組成。對象由存儲空間內部惟一的 Key 來標識。對象元信息是一組鍵值對,表示了對象的一些屬性,好比最後修改時間、大小等信息,同時您也能夠在元信息中存儲一些自定義的信息。運維

  • 地域(Region)

    地域表示 OSS 的數據中心所在物理位置。您能夠根據費用、請求來源等選擇合適的地域建立 Bucket。詳情請參見 OSS 已開通的Region。工具

  • 訪問域名(Endpoint)

    Endpoint 表示 OSS 對外服務的訪問域名。OSS 以 HTTP RESTful API 的形式對外提供服務,當訪問不一樣地域的時候,須要不一樣的域名。經過內網和外網訪問同一個地域所須要的域名也是不一樣的。具體的內容請參見各個 Region 對應的 Endpoint。性能

  • 訪問密鑰(AccessKey)

    AccessKey(簡稱 AK)指的是訪問身份驗證中用到的 AccessKeyId 和 AccessKeySecret。OSS 經過使用 AccessKeyId 和 AccessKeySecret 對稱加密的方法來驗證某個請求的發送者身份。AccessKeyId 用於標識用戶;AccessKeySecret 是用戶用於加密簽名字符串和 OSS 用來驗證簽名字符串的密鑰,必須保密。獲取 AccessKey 的方法請參見建立 AccessKey。

package utils;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.Bucket;
import com.aliyun.oss.model.BucketList;
import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.DeleteObjectsResult;
import com.aliyun.oss.model.ListBucketsRequest;
import com.aliyun.oss.model.ListObjectsRequest;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;

public class OssUtil {
    public static Logger logger = Logger.getLogger(OssUtil.class);
    public static OSSClient ossClient = null;
    
    /**
     * @Title: getOSSClient 
     * @Description: 獲取oss客戶端 
     * @return OSSClient oss客戶端 
     */
    public static OSSClient getOSSClient() {
        try {
            if (null == ossClient) {
                //endpoint,域名地址
                String endpoint = "http://oss-cn-shenzhen.aliyuncs.com";
                //阿里雲主帳號AccessKey擁有全部API的訪問權限,風險很高。
                //強烈建議您建立並使用RAM帳號進行API訪問或平常運維,請登陸https://ram.console.aliyun.com 建立RAM帳號。
                String accessKeyId = "你的accessKeyId";
                String accessKeySecret = "你的accessKeySecret";
                ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
            }
        } catch (Exception e) {
            logger.error("獲取ossClient異常", e);
        }
        return ossClient;
    }
    
    /**
     * getBucketListWithPrefixAndMarker
     * 存儲空間(Bucket)是存儲對象(Object)的容器。對象都隸屬於存儲空間。
     * 列舉指定前綴(prefix)、指定標記(marker)以後的存儲空間(bucket)信息
     */
    public BucketList getBucketList(){
        // Endpoint以杭州爲例,其它Region請按實際狀況填寫。
        String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
        // 阿里雲主帳號AccessKey擁有全部API的訪問權限,風險很高。
        // 強烈建議您建立並使用RAM帳號進行API訪問或平常運維,請登陸 https://ram.console.aliyun.com 建立RAM帳號。
        String accessKeyId = "<yourAccessKeyId>";
        String accessKeySecret = "<yourAccessKeySecret>";
        // 建立OSSClient實例。
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);

        ListBucketsRequest listBucketsRequest = new ListBucketsRequest();
        // 列舉指定前綴的存儲空間。
        listBucketsRequest.setPrefix("<yourBucketPrefix>");
        // 列舉指定marker以後的存儲空間。
        listBucketsRequest.setMarker("<yourBucketMarker>");
        
        BucketList bucketList = ossClient.listBuckets(listBucketsRequest);
        for (Bucket bucket : bucketList.getBucketList()) {
            System.out.println(" - " + bucket.getName());
        }
        // 關閉OSSClient。
        ossClient.shutdown();
        return bucketList;
    }
    
    /**
     * OSS文件按照字母順序排列。您能夠經過ossClient.listObjects列出存儲空間下的文件。listObjects有如下三類參數格式:
     * ObjectListing listObjects(String bucketName):列舉存儲空間下的文件。最多列舉100個文件。
     * ObjectListing listObjects(String bucketName, String prefix): 列舉存儲空間下指定前綴的文件。最多列舉100個文件。
     * ObjectListing listObjects(ListObjectsRequest listObjectsRequest):提供多種過濾功能,實現靈活的查詢功能。
     * 
     * ObjectListing的參數以下:
     * objectSummaries    限定返回的文件元信息。    List<OSSObjectSummary> getObjectSummaries()
     * prefix    本次查詢結果的前綴。    String getPrefix()
     * delimiter    對文件名稱進行分組的一個字符。    String getDelimiter()
     * marker    標明本次列舉文件的起點。    String getMarker()
     * maxKeys    列舉文件的最大個數。    int getMaxKeys()
     * nextMarker    下一次列舉文件的起點。    String getNextMarker()
     * isTruncated    指明列舉文件是否被截斷。列舉完沒有截斷,返回值爲false。沒列舉完就有截斷,返回值爲true。boolean isTruncated()
     * commonPrefixes    以delimiter結尾,且有共同前綴的文件集合。    List<String> getCommonPrefixes()
     * encodingType    指明返回結果中編碼使用的類型。    String getEncodingType()
     */
    public ObjectListing getObjectList(){
        // Endpoint以杭州爲例,其它Region請按實際狀況填寫。
        String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
        // 阿里雲主帳號AccessKey擁有全部API的訪問權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或平常運維,請登陸 https://ram.console.aliyun.com 建立RAM帳號。
        String accessKeyId = "<yourAccessKeyId>";
        String accessKeySecret = "<yourAccessKeySecret>";
        String bucketName = "<yourBucketName>";
        // 建立OSSClient實例。
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        // 指定每頁200個文件。
        final int maxKeys = 200;
        final String keyPrefix = "<yourkeyPrefix>";
        String nextMarker = null;
        ObjectListing objectListing;

        do {
            objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).
                    withPrefix(keyPrefix).withMarker(nextMarker).withMaxKeys(maxKeys));
            List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
            for (OSSObjectSummary s : sums) {
                System.out.println("\t" + s.getKey());
            }
            nextMarker = objectListing.getNextMarker();
        } while (objectListing.isTruncated());

        // 關閉OSSClient。
        ossClient.shutdown();
        return objectListing;
    }
    
    /**
     * 批量刪除文件,每次最多刪除1000個文件。有兩種返回模式:
     * 詳細(verbose)模式:返回刪除成功的文件列表。默認爲詳細模式。
     * 簡單(quiet)模式:返回刪除失敗的文件列表。
     * 
     * DeleteObjectsRequest的參數以下:
     * Keys    須要刪除的文件。    setKeys(List<String>)
     * quiet    返回模式。true表示簡單模式,false表示詳細模式。默認爲詳細模式。    setQuiet(boolean)
     * encodingType    對返回的文件名稱進行編碼。編碼類型目前僅支持url。    setEncodingType(String)
     * 
     * DeleteObjectsResult的參數以下:
     * deletedObjects    刪除結果。詳細模式下爲刪除成功的文件列表,簡單模式下爲刪除失敗的文件列表。    List<String> getDeletedObjects()
     * encodingType    deletedObjects中文件名稱的編碼,爲空表示沒有編碼。    getEncodingType()
     */
    public void deleteObjectBatch(){
        // Endpoint以杭州爲例,其它Region請按實際狀況填寫。
        String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
        // 阿里雲主帳號AccessKey擁有全部API的訪問權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或平常運維,請登陸 https://ram.console.aliyun.com 建立RAM帳號。
        String accessKeyId = "<yourAccessKeyId>";
        String accessKeySecret = "<yourAccessKeySecret>";
        String bucketName = "<yourBucketName>";

        // 建立OSSClient實例。
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);

        // 刪除文件。key等同於ObjectName,表示刪除OSS文件時須要指定包含文件後綴在內的完整路徑,例如abc/efg/123.jpg。
        List<String> keys = new ArrayList<String>();
        keys.add("key0");
        keys.add("key1");
        keys.add("key2");

        DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys));
        List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();

        // 關閉OSSClient。
        ossClient.shutdown();
    }
    
    /**
     * 
     * @Title: uploadByNetworkStream 
     * @Description: 經過網絡流上傳文件
     * @param ossClient     oss客戶端 
     * @param url             URL 
     * @param bucketName     bucket名稱 
     * @param objectName     上傳文件目錄和(包括文件名)例如「test/index.html」 
     * @return void         返回類型
     * @throws
     */
    public static void uploadByNetworkStream(OSSClient ossClient, URL url, String bucketName, String objectName) {
        try {
            InputStream inputStream = url.openStream();
            ossClient.putObject(bucketName, objectName, inputStream);
            ossClient.shutdown();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
    
    /**
     * @Title: uploadByInputStream 
     * @Description: 經過輸入流上傳文件
     * @param ossClient     oss客戶端 
     * @param inputStream     輸入流 
     * @param bucketName     bucket名稱
     * @param objectName     上傳文件目錄和(包括文件名) 例如「test/a.jpg」 
     * @return void         返回類型 
     * @throws
     */
    public static void uploadByInputStream(OSSClient ossClient, InputStream inputStream, String bucketName,
            String objectName) {
        try {
            ossClient.putObject(bucketName, objectName, inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
    
    /**
     * @Title: uploadByFile 
     * @Description: 經過file上傳文件 
     * @param ossClient     oss客戶端 
     * @param file             上傳的文件 
     * @param bucketName     bucket名稱
     * @param objectName     上傳文件目錄和(包括文件名) 例如「test/a.jpg」 
     * @return void         返回類型
     */
    public static void uploadByFile(OSSClient ossClient, File file, String bucketName, String objectName) {
        try {
            ossClient.putObject(bucketName, objectName, file);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
    
    
    /**
     * @Title: deleteFile  
     * @Description: 根據key刪除oss服務器上的文件
     * @param ossClient        oss客戶端 
     * @param bucketName        bucket名稱 
     * @param key            文件路徑/名稱,例如「test/a.txt」  
     * @return void            返回類型  
     */
    public static void deleteFile(OSSClient ossClient, String bucketName, String key) {
        ossClient.deleteObject(bucketName, key);
    }
    
    /**
     * @Title: getInputStreamByOSS 
     * @Description:根據key獲取服務器上的文件的輸入流 
     * @param ossClient     oss客戶端  
     * @param bucketName     bucket名稱 
     * @param key             文件路徑和名稱 
     * @return InputStream     文件輸入流
     */
    public static InputStream getInputStreamByOSS(OSSClient ossClient, String bucketName, String key) {
        InputStream content = null;
        try {
            OSSObject ossObj = ossClient.getObject(bucketName, key);
            content = ossObj.getObjectContent();
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return content;
    }
}
相關文章
相關標籤/搜索