閱讀887 返回首頁    go 阿裏雲


管理文件__Java-SDK_SDK 參考_對象存儲 OSS-阿裏雲

在OSS中,用戶可以通過一係列的接口管理存儲空間(Bucket)中的文件(Object),比如SetObjectAcl,GetObjectAcl,ListObjects,DeleteObject,CopyObject,DoesObjectExist等。Object的名字又稱為key或object key。

Object是否存在

通過OSSClient.doesObjectExist判斷文件(object)是否存在。

  1. // endpoint以杭州為例,其它region請按實際情況填寫
  2. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
  3. // accessKey請登錄https://ak-console.aliyun.com/#/查看
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. // 創建OSSClient實例
  7. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  8. // Object是否存在
  9. boolean found = ossClient.doesObjectExist("<bucketName>", "<key>")
  10. // 關閉client
  11. ossClient.shutdown();

Object ACL

Object有四種訪問權限:Default(默認),Private(私有讀寫), PublicRead(公共讀私有寫), PublicReadWrite(公共讀寫),含義如下:

權限 描述
默認 Objec是遵循Bucket的讀寫權限,即Bucket是什麼權限,Object就是什麼權限,Object的默認權限
私有讀寫 Object是私有資源,即隻有該Object的Owner擁有該Object的讀寫權限,其他的用戶沒有權限操作該Object
公共讀私有寫 Object是公共讀資源,即非Object Owner隻有Object的讀權限,而Object Owner擁有該Object的讀寫權限
公共讀寫 Object是公共讀寫資源,即所有用戶擁有對該Object的讀寫權限

Object的權限優先級高於Bucket。例如Bucket是private的,而Object ACL是公共讀寫,則訪問這個Object時,先判斷Object的ACL,所有用戶都擁有這個Object的訪問權限,即使這個Bucket是private。如果某個Object從來沒設置過ACL,則訪問權限遵循Bucket ACL。

設置Object ACL

您可以通過OSSClient.setObjectAcl設置Object的權限。

權限 Java SDK對應值
私有讀寫 CannedAccessControlList.Private
公共讀私有寫 CannedAccessControlList.PublicRead
公共讀寫 CannedAccessControlList.PublicReadWrite

下麵代碼為Object設置ACL:

  1. // endpoint以杭州為例,其它region請按實際情況填寫
  2. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
  3. // accessKey請登錄https://ak-console.aliyun.com/#/查看
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. // 創建OSSClient實例
  7. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  8. // 設置Object權限
  9. ossClient.setObjectAcl("<bucketName>", "<key>", CannedAccessControlList.PublicRead)
  10. // 關閉client
  11. ossClient.shutdown();

獲取Object ACL

您可以通過OSSClient.getObjectAcl獲取Object的權限。

  1. // endpoint以杭州為例,其它region請按實際情況填寫
  2. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
  3. // accessKey請登錄https://ak-console.aliyun.com/#/查看
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. // 創建OSSClient實例
  7. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  8. //讀取Object ACL
  9. ObjectAcl objectAcl = ossClient.getObjectAcl("<bucketName>", "<key>");
  10. System.out.println(objectAcl.getPermission().toString());
  11. // 關閉client
  12. ossClient.shutdown();

獲取文件元信息(Object Meta)

文件元信息(Object Meta),是對用戶上傳到OSS的文件的屬性描述,分為兩種:HTTP標準屬性(HTTP Headers)和User Meta(用戶自定義元信息)。 文件元信息可以在各種方式上傳或者拷貝文件時進行設置。更多文件元信息的介紹,請參看文件元信息

獲取文件元信息可以使用OSSClient.getSimplifiedObjectMetaOSSClient.getObjectMetadatagetSimplifiedObjectMeta隻能獲取文件的ETag、Size(文件大小)、 LastModified(最後修改時間);getObjectMetadata能獲取文件的全部元數據。getSimplifiedObjectMeta更輕量、更快

  1. // endpoint以杭州為例,其它region請按實際情況填寫
  2. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
  3. // accessKey請登錄https://ak-console.aliyun.com/#/查看
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. // 創建OSSClient實例
  7. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  8. // 獲取文件的部分元信息
  9. SimplifiedObjectMeta objectMeta = ossClient.getSimplifiedObjectMeta("<bucketName>", "<key>");
  10. System.out.println(objectMeta.getSize());
  11. System.out.println(objectMeta.getETag());
  12. System.out.println(objectMeta.getLastModified());
  13. // 獲取文件的全部元信息
  14. ObjectMetadata metadata = ossClient.getObjectMetadata("<bucketName>", "<key>");
  15. System.out.println(metadata.getContentType());
  16. System.out.println(metadata.getLastModified());
  17. System.out.println(metadata.getExpirationTime());
  18. // 關閉client
  19. ossClient.shutdown();

列出存儲空間中的文件

可以通過OSSClient.listObjects列出bucket裏的Objects。listObjects有三類參數格式:

  • ObjectListing listObjects(String bucketName)
  • ObjectListing listObjects(String bucketName, String prefix)
  • ObjectListing listObjects(ListObjectsRequest listObjectsRequest)

前兩類稱為簡單列舉,最多返回100條object,參數prefix是指定返回Object的前綴。最後一類提供多種過濾功能,可以實現靈活的查詢功能。

ObjectListing的參數如下:

參數 含義 方法
ObjectSummaries 限定返回的object meta。 List<OSSObjectSummary> getObjectSummaries()
Prefix 本次查詢結果的開始前綴。 String getPrefix()
Delimiter 是一個用於對Object名字進行分組的字符。 String getDelimiter()
Marker 標明這次List Object的起點。 String getMarker()
MaxKeys 響應請求內返回結果的最大數目。 int getMaxKeys()
NextMarker 下一次List Object的起點。 String getNextMarker()
IsTruncated 指明是否所有的結果都已經返回。 boolean isTruncated()
CommonPrefixes 如果請求中指定了delimiter參數,則返回的包含CommonPrefixes元素。該元素標明以delimiter結尾,並有共同前綴的object的集合。 List<String> getCommonPrefixes()
EncodingType 指明返回結果中編碼使用的類型。 String getEncodingType()

提示:

  • listObjects的完整代碼請參考:GitHub

簡單列舉

列舉出Bucket下的Object,最多100條object。

  1. // endpoint以杭州為例,其它region請按實際情況填寫
  2. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
  3. // accessKey請登錄https://ak-console.aliyun.com/#/查看
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. // 創建OSSClient實例
  7. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  8. // 列舉Object
  9. ObjectListing objectListing = ossClient.listObjects("<bucketName>", "<KeyPrifex>");
  10. List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  11. for (OSSObjectSummary s : sums) {
  12. System.out.println("t" + s.getKey());
  13. }
  14. // 關閉client
  15. ossClient.shutdown();

列舉出Bucket下的指定前綴的Object,最多100條object。

  1. ObjectListing objectListing = ossClient.listObjects("<bucketName>", "<KeyPrifex>");
  2. List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  3. for (OSSObjectSummary s : sums) {
  4. System.out.println("t" + s.getKey());
  5. }

通過ListObjectsRequest列出文件

可以通過設置ListObjectsReques的參數實現各種靈活的查詢功能。ListObjectsReques的可設置的參數如下:

參數 作用 方法
Prefix 限定返回的object key必須以prefix作為前綴。 setPrefix(String prefix)
Delimiter 是一個用於對Object名字進行分組的字符。所有名字包含指定的前綴且第一次出現delimiter字符之間的object作為一組元素——CommonPrefixes。 setDelimiter(String delimiter)
Marker 設定結果從marker之後按字母排序的第一個開始返回。 setMarker(String marker)
MaxKeys 限定此次返回object的最大數,如果不設定,默認為100,max-keys取值不能大於1000。 setMaxKeys(Integer maxKeys)
EncodingType 請求響應體中Object名稱采用的編碼方式,目前支持url setEncodingType(String encodingType)

指定最大返回條數

  1. // endpoint以杭州為例,其它region請按實際情況填寫
  2. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
  3. // accessKey請登錄https://ak-console.aliyun.com/#/查看
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. // 創建OSSClient實例
  7. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  8. final int maxKeys = 200;
  9. // 列舉Object
  10. ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest("<bucketName>").withMaxKeys(maxKeys));
  11. List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  12. for (OSSObjectSummary s : sums) {
  13. System.out.println("t" + s.getKey());
  14. }
  15. // 關閉client
  16. ossClient.shutdown();

返回指定前綴的object

最多返回100條。

  1. final String keyPrefix = "<keyPrefix>"
  2. ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest("<bucketName>").withPrefix(keyPrefix));
  3. List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  4. for (OSSObjectSummary s : sums) {
  5. System.out.println("t" + s.getKey());
  6. }

從指定Object後返回

不包括指定的Object,最多返回100條。

  1. final String keyMarker = "<keyMarker>"
  2. ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest("<bucketName>").withMarker(keyMarker));
  3. List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  4. for (OSSObjectSummary s : sums) {
  5. System.out.println("t" + s.getKey());
  6. }

分頁獲取所有Object

分頁獲取所有Object,每頁maxKeys條Object。

  1. final int maxKeys = 200;
  2. String nextMarker = null;
  3. do {
  4. objectListing = ossClient.listObjects(new ListObjectsRequest("<bucketName>").withMarker(nextMarker).withMaxKeys(maxKeys));
  5. List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  6. for (OSSObjectSummary s : sums) {
  7. System.out.println("t" + s.getKey());
  8. }
  9. nextMarker = objectListing.getNextMarker();
  10. } while (objectListing.isTruncated());

分頁獲取所有特定Object後的Object

分頁獲取所有特定Object後的Object,每頁maxKeys條Object。

  1. final int maxKeys = 200;
  2. String nextMarker = "<nextMarker>";
  3. do {
  4. objectListing = ossClient.listObjects(new ListObjectsRequest("<bucketName>").withMarker(nextMarker).withMaxKeys(maxKeys));
  5. List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  6. for (OSSObjectSummary s : sums) {
  7. System.out.println("t" + s.getKey());
  8. }
  9. nextMarker = objectListing.getNextMarker();
  10. } while (objectListing.isTruncated());

分頁所有獲取指定前綴的Object

分頁所有獲取指定前綴的Object,每頁maxKeys條Object。

  1. final int maxKeys = 200;
  2. final String keyPrefix = "<keyPrefix>";
  3. String nextMarker = "<nextMarker>";
  4. do {
  5. objectListing = ossClient.listObjects(new ListObjectsRequest("<bucketName>").
  6. withPrefix(keyPrefix).withMarker(nextMarker).withMaxKeys(maxKeys));
  7. List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  8. for (OSSObjectSummary s : sums) {
  9. System.out.println("t" + s.getKey());
  10. }
  11. nextMarker = objectListing.getNextMarker();
  12. } while (objectListing.isTruncated());

指定Object名字編碼

如果Object名字含有特殊字符,如 ' " & < >中文 等,需要進行編碼傳輸。OSS目前支持 url 編碼。

  1. final int maxKeys = 200;
  2. final String keyPrefix = "<keyPrefix>";
  3. String nextMarker = "<nextMarker>";
  4. ObjectListing objectListing;
  5. do {
  6. ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
  7. listObjectsRequest.setPrefix(keyPrefix);
  8. listObjectsRequest.setMaxKeys(maxKeys);
  9. listObjectsRequest.setMarker(nextMarker);
  10. // 指定Object名稱編碼傳輸
  11. listObjectsRequest.setEncodingType("url");
  12. objectListing = ossClient.listObjects(listObjectsRequest);
  13. // Object解碼
  14. for (OSSObjectSummary objectSummary: objectListing.getObjectSummaries()) {
  15. System.out.println("Key:" + URLDecoder.decode(objectSummary.getKey(), "UTF-8"));
  16. }
  17. // CommonPrefixe解碼
  18. for (String commonPrefixes: objectListing.getCommonPrefixes()) {
  19. System.out.println("CommonPrefixes:" + URLDecoder.decode(commonPrefixes, "UTF-8"));
  20. }
  21. // NextMarker解碼
  22. if (objectListing.getNextMarker() != null) {
  23. nextMarker = URLDecoder.decode(objectListing.getNextMarker(), "UTF-8");
  24. }
  25. } while (objectListing.isTruncated());

模擬文件夾功能

OSS是沒有文件夾這個概念的,所有元素都是以Object來存儲。創建模擬文件夾本質上來說是創建了一個size為0的Object。對於這個Object可以上傳下載,隻是控製台會對以”/“結尾的Object以文件夾的方式展示。

您可以通過 Delimiter 和 Prefix 參數的配合模擬出文件夾功能。Delimiter 和 Prefix 的組合效果是這樣的:

  • 如果把 Prefix 設為某個文件夾名,就可以羅列以此 Prefix 開頭的文件,即該文件夾下遞歸的所有的文件和子文件夾(目錄)。文件名在Contents中顯示。
  • 如果再把 Delimiter 設置為 “/” 時,返回值就隻羅列該文件夾下的文件和子文件夾(目錄),該文件夾下的子文件名(目錄)返回在 CommonPrefixes 部分,子文件夾下遞歸的文件和文件夾不被顯示。

提示:

假設Bucket中有4個文件: oss.jpg , fun/test.jpg , fun/movie/001.avi , fun/movie/007.avi , “/” 作為文件夾的分隔符。下麵的示例展示了如何模擬文件夾功能。

列出存儲空間內所有文件

當我們需要獲取存儲空間下的所有文件時,可以這樣寫:

  1. // 構造ListObjectsRequest請求
  2. ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
  3. // 列出Object
  4. ObjectListing listing = ossClient.listObjects(listObjectsRequest);
  5. // 遍曆所有Object
  6. System.out.println("Objects:");
  7. for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
  8. System.out.println(objectSummary.getKey());
  9. }
  10. // 遍曆所有CommonPrefix
  11. System.out.println("CommonPrefixs:");
  12. for (String commonPrefix : listing.getCommonPrefixes()) {
  13. System.out.println(commonPrefix);
  14. }

輸出:

  1. Objects:
  2. fun/movie/001.avi
  3. fun/movie/007.avi
  4. fun/test.jpg
  5. oss.jpg
  6. CommonPrefixs:

遞歸列出目錄下所有文件

我們可以通過設置 Prefix 參數來獲取某個目錄(fun/)下所有的文件:

  1. // 構造ListObjectsRequest請求
  2. ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
  3. listObjectsRequest.setPrefix("fun/");
  4. // 遞歸列出fun目錄下的所有文件
  5. ObjectListing listing = ossClient.listObjects(listObjectsRequest);
  6. // 遍曆所有Object
  7. System.out.println("Objects:");
  8. for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
  9. System.out.println(objectSummary.getKey());
  10. }
  11. // 遍曆所有CommonPrefix
  12. System.out.println("nCommonPrefixs:");
  13. for (String commonPrefix : listing.getCommonPrefixes()) {
  14. System.out.println(commonPrefix);
  15. }

輸出:

  1. Objects:
  2. fun/movie/001.avi
  3. fun/movie/007.avi
  4. fun/test.jpg
  5. CommonPrefixs:

列出目錄下的文件和子目錄

在 Prefix 和 Delimiter 結合的情況下,可以列出目錄(fun/)下的文件和子目錄:

  1. // 構造ListObjectsRequest請求
  2. ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
  3. // "/" 為文件夾的分隔符
  4. listObjectsRequest.setDelimiter("/");
  5. // 列出fun目錄下的所有文件和文件夾
  6. listObjectsRequest.setPrefix("fun/");
  7. ObjectListing listing = ossClient.listObjects(listObjectsRequest);
  8. // 遍曆所有Object
  9. System.out.println("Objects:");
  10. for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
  11. System.out.println(objectSummary.getKey());
  12. }
  13. // 遍曆所有CommonPrefix
  14. System.out.println("nCommonPrefixs:");
  15. for (String commonPrefix : listing.getCommonPrefixes()) {
  16. System.out.println(commonPrefix);
  17. }

輸出:

  1. Objects:
  2. fun/test.jpg
  3. CommonPrefixs:
  4. fun/movie/

提示:

  • 返回的結果中, ObjectSummaries 的列表中給出的是fun目錄下的文件。
  • 而 CommonPrefixs 的列表中給出的是fun目錄下的所有子文件夾。可以看出 fun/movie/001.avi , fun/movie/007.avi 兩個文件並沒有被列出來,因為它們屬於fun文件夾下的movie目錄。

刪除文件

刪除單個文件:

您可以通過OSSClient.deleteObject刪除單個文件。

  1. // endpoint以杭州為例,其它region請按實際情況填寫
  2. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
  3. // accessKey請登錄https://ak-console.aliyun.com/#/查看
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. // 創建OSSClient實例
  7. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  8. // 刪除Object
  9. ossClient.deleteObject("<bucketName>", "<key>");
  10. // 關閉client
  11. ossClient.shutdown();

刪除多個文件:

您可以通過OSSClient.deleteObjects批量刪除文件。

  1. public DeleteObjectsResult deleteObjects(DeleteObjectsRequest deleteObjectsRequest)

每次最多刪除1000個Object,並提供兩種返回模式:詳細(verbose)模式和簡單(quiet)模式:

  • 詳細模式:返回的成功刪除Object的結果,即DeleteObjectsResult.getDeletedObjects,默認模式;
  • 簡單模式:返回的刪除過程中出錯的Object結果,即DeleteObjectsResult.getDeletedObjects。

DeleteObjectsRequest可設置參數如下:

參數 作用 方法
Keys 需要刪除的Objects setKeys(List<String>)
Quiet 返回模式,默認詳細模式;true簡單模式,false詳細模式 setQuiet(boolean)
EncodingType 指定對返回的Key進行編碼,目前支持url setEncodingType(String)

DeleteObjectsResult的參數如下:

參數 含義 方法
deletedObjects 刪除結果,詳細模式時成功刪除的objects,簡單模式時刪除失敗的objects List<String> getDeletedObjects()
EncodingType deletedObjects中Key的進行編碼,為空沒有編碼 getEncodingType()
  1. // endpoint以杭州為例,其它region請按實際情況填寫
  2. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
  3. // accessKey請登錄https://ak-console.aliyun.com/#/查看
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. // 創建OSSClient實例
  7. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  8. // 刪除Objects
  9. List<String> keys = new ArrayList<String>();
  10. keys.add("key0");
  11. keys.add("key1");
  12. keys.add("key2");
  13. DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest("<bucketName>").withKeys(keys));
  14. List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
  15. // 關閉client
  16. ossClient.shutdown();

提示:

  • 批量刪除文件的完整代碼請參考:GitHub

拷貝文件

在同一個區域(杭州,深圳,青島等)中,可以將Object從一個Bucket複製到另外一個Bucket。您可以通過OSSClient.copyObject

  • CopyObjectResult copyObject(String sourceBucketName, String sourceKey, String destinationBucketName, String destinationKey)
  • CopyObjectResult copyObject(CopyObjectRequest copyObjectRequest)

第一個方法指定源Bucket/Key和目標源Bucket/Key,目標object的內容和元數據與源object相同,稱為簡單拷貝。第二個方法允許指定目標文件的原因數據、允許指定拷貝的限製條件。如果拷貝操作的源Object地址和目標Object地址相同,則直接替換源Object的meta信息。

CopyObjectRequest可設置參數如下:

參數 作用 方法
sourceBucketName 源Object所在的Bucket的名稱 setSourceBucketName(String sourceBucketName)
sourceKey 源Object的Key setSourceKey(String sourceKey)
destinationBucketName 目標Object所在的Bucket的名稱 setDestinationBucketName(String destinationBucketName)
destinationKey 目標Object的Key setDestinationKey(String destinationKey)
newObjectMetadata 目標Object的元信息 setNewObjectMetadata(ObjectMetadata newObjectMetadata)
matchingETagConstraints 拷貝的限製條件,如果源Object的ETAG值和提供的ETAG相等,則執行拷貝操作;否則返回錯誤 setMatchingETagConstraints(List<String> matchingETagConstraints)
nonmatchingEtagConstraints 拷貝的限製條件,如果源Object的ETAG值和用戶提供的ETAG不相等,則執行拷貝操作;否則返回錯誤 setNonmatchingETagConstraints(List<String> nonmatchingEtagConstraints)
unmodifiedSinceConstraint 拷貝的限製條件,如果傳入參數中的時間等於或者晚於文件實際修改時間,則正常拷貝;否則返回錯誤 setUnmodifiedSinceConstraint(Date unmodifiedSinceConstraint)
modifiedSinceConstraint 拷貝的限製條件,如果源Object自從用戶指定的時間以後被修改過,則執行拷貝操作;否則返回錯誤 setModifiedSinceConstraint(Date modifiedSinceConstraint)

CopyObjectRequest的參數如下:

參數 含義 方法
etag OSS Object唯一性標誌 String getETag()
lastModified Object最後修改時間 Date getLastModified()

注意:

  • 用戶需要有源Object的操作權限,否則會無法完成操作。
  • 該操作不支持跨Region拷貝數據。比如:不支持將杭州Bucket裏的Object拷貝到青島。
  • 該操作支持的最大Object大小為1GB。

簡單拷貝

  1. // endpoint以杭州為例,其它region請按實際情況填寫
  2. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
  3. // accessKey請登錄https://ak-console.aliyun.com/#/查看
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. // 創建OSSClient實例
  7. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  8. // 拷貝Object
  9. CopyObjectResult result = ossClient.copyObject("<srcBucketName>", "<srcKey>", "<destBucketName>", "<destKey>");
  10. System.out.println("ETag: " + result.getETag() + " LastModified: " + result.getLastModified());
  11. // 關閉client
  12. ossClient.shutdown();

通過CopyObjectRequest拷貝

也可以通過 CopyObjectRequest 實現Object的拷貝:

  1. // endpoint以杭州為例,其它region請按實際情況填寫
  2. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
  3. // accessKey請登錄https://ak-console.aliyun.com/#/查看
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. // 創建OSSClient實例
  7. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  8. // 創建CopyObjectRequest對象
  9. CopyObjectRequest copyObjectRequest = new CopyObjectRequest(srcBucketName, srcKey, destBucketName, destKey);
  10. // 設置新的Metadata
  11. ObjectMetadata meta = new ObjectMetadata();
  12. meta.setContentType("text/html");
  13. copyObjectRequest.setNewObjectMetadata(meta);
  14. // 複製Object
  15. CopyObjectResult result = ossClient.copyObject(copyObjectRequest);
  16. System.out.println("ETag: " + result.getETag() + " LastModified: " + result.getLastModified());
  17. // 關閉client
  18. ossClient.shutdown();

拷貝大文件

CopyObject隻能copy小於1GB的文件,大文件需要使用分片拷貝(Upload Part Copy)。分片拷貝更詳細的說明,請參考Upload Part Copy。分片拷貝分為三步:

  • 初始化分片拷貝任務OSSClient.initiateMultipartUpload
  • 分片拷貝OSSClient.uploadPartCopy,除最後一個分片外,其它的分片大小都要大於100KB;
  • 提交分片拷貝任務OSSClient.completeMultipartUpload

提示:

  • 分片拷貝的完整代碼請參考:GitHub
  1. String sourceBucketName = "<sourceBucketName>";
  2. String sourceKey = "<sourceKey>";
  3. String targetBucketName = "<targetBucketName>";
  4. String targetKey = "<targetKey>";
  5. // 得到被拷貝object大小
  6. ObjectMetadata objectMetadata = ossClient.getObjectMetadata(sourceBucketName, sourceKey);
  7. long contentLength = objectMetadata.getContentLength();
  8. // 分片大小,10MB
  9. long partSize = 1024 * 1024 * 10;
  10. // 計算分塊數目
  11. int partCount = (int) (contentLength / partSize);
  12. if (contentLength % partSize != 0) {
  13. partCount++;
  14. }
  15. System.out.println("total part count:" + partCount);
  16. // 初始化拷貝任務
  17. InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(targetBucketName, targetKey);
  18. InitiateMultipartUploadResult initiateMultipartUploadResult = ossClient.initiateMultipartUpload(initiateMultipartUploadRequest);
  19. String uploadId = initiateMultipartUploadResult.getUploadId();
  20. // 分片拷貝
  21. List<PartETag> partETags = new ArrayList<PartETag>();
  22. for (int i = 0; i < partCount; i++) {
  23. // 計算每個分塊的大小
  24. long skipBytes = partSize * i;
  25. long size = partSize < contentLength - skipBytes ? partSize : contentLength - skipBytes;
  26. // 創建UploadPartCopyRequest
  27. UploadPartCopyRequest uploadPartCopyRequest =
  28. new UploadPartCopyRequest(sourceBucketName, sourceKey, targetBucketName, targetKey);
  29. uploadPartCopyRequest.setUploadId(uploadId);
  30. uploadPartCopyRequest.setPartSize(size);
  31. uploadPartCopyRequest.setBeginIndex(skipBytes);
  32. uploadPartCopyRequest.setPartNumber(i + 1);
  33. UploadPartCopyResult uploadPartCopyResult = ossClient.uploadPartCopy(uploadPartCopyRequest);
  34. // 將返回的PartETag保存到List中
  35. partETags.add(uploadPartCopyResult.getPartETag());
  36. }
  37. // 提交分片拷貝任務
  38. CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(
  39. targetBucketName, targetKey, uploadId, partETags);
  40. ossClient.completeMultipartUpload(completeMultipartUploadRequest);

提示:

  • 分片拷貝時,可以指定目標object的元信息,通過InitiateMultipartUploadRequest指定;
  • 分片拷貝也支持限定條件,通過UploadPartCopyRequest指定。

最後更新:2016-12-09 17:54:26

  上一篇:go 下載文件__Java-SDK_SDK 參考_對象存儲 OSS-阿裏雲
  下一篇:go 授權訪問__Java-SDK_SDK 參考_對象存儲 OSS-阿裏雲