本文介紹一些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)做爲不常常訪問數據的存儲方式。安全
OSS 提供標準、低頻訪問、歸檔三種存儲類型,全面覆蓋從熱到冷的各類數據存儲場景。其中標準存儲類型提供高可靠、高可用、高性能的對象存儲服務,可以支持頻繁的數據訪問;低頻訪問存儲類型適合長期保存不常常訪問的數據(平均每個月訪問頻率 1 到 2 次),存儲單價低於標準類型;歸檔存儲類型適合須要長期保存(建議半年以上)的歸檔數據,在三種存儲類型中單價最低。詳情請參見存儲類型介紹。服務器
存儲空間是您用於存儲對象(Object)的容器,全部的對象都必須隸屬於某個存儲空間。存儲空間具備各類配置屬性,包括地域、訪問權限、存儲類型等。您能夠根據實際需求,建立不一樣類型的存儲空間來存儲不一樣的數據。建立存儲空間請參見建立存儲空間。網絡
對象是 OSS 存儲數據的基本單元,也被稱爲 OSS 的文件。對象由元信息(Object Meta)、用戶數據(Data)和文件名(Key)組成。對象由存儲空間內部惟一的 Key 來標識。對象元信息是一組鍵值對,表示了對象的一些屬性,好比最後修改時間、大小等信息,同時您也能夠在元信息中存儲一些自定義的信息。運維
地域表示 OSS 的數據中心所在物理位置。您能夠根據費用、請求來源等選擇合適的地域建立 Bucket。詳情請參見 OSS 已開通的Region。工具
Endpoint 表示 OSS 對外服務的訪問域名。OSS 以 HTTP RESTful API 的形式對外提供服務,當訪問不一樣地域的時候,須要不一樣的域名。經過內網和外網訪問同一個地域所須要的域名也是不一樣的。具體的內容請參見各個 Region 對應的 Endpoint。性能
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; } }