887
阿裏雲
管理文件__Java-SDK_SDK 參考_對象存儲 OSS-阿裏雲
在OSS中,用戶可以通過一係列的接口管理存儲空間(Bucket)中的文件(Object),比如SetObjectAcl,GetObjectAcl,ListObjects,DeleteObject,CopyObject,DoesObjectExist等。Object的名字又稱為key或object key。
Object是否存在
通過OSSClient.doesObjectExist判斷文件(object)是否存在。
// endpoint以杭州為例,其它region請按實際情況填寫String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// accessKey請登錄https://ak-console.aliyun.com/#/查看String accessKeyId = "<yourAccessKeyId>";String accessKeySecret = "<yourAccessKeySecret>";// 創建OSSClient實例OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);// Object是否存在boolean found = ossClient.doesObjectExist("<bucketName>", "<key>")// 關閉clientossClient.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:
// endpoint以杭州為例,其它region請按實際情況填寫String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// accessKey請登錄https://ak-console.aliyun.com/#/查看String accessKeyId = "<yourAccessKeyId>";String accessKeySecret = "<yourAccessKeySecret>";// 創建OSSClient實例OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);// 設置Object權限ossClient.setObjectAcl("<bucketName>", "<key>", CannedAccessControlList.PublicRead)// 關閉clientossClient.shutdown();
獲取Object ACL
您可以通過OSSClient.getObjectAcl獲取Object的權限。
// endpoint以杭州為例,其它region請按實際情況填寫String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// accessKey請登錄https://ak-console.aliyun.com/#/查看String accessKeyId = "<yourAccessKeyId>";String accessKeySecret = "<yourAccessKeySecret>";// 創建OSSClient實例OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);//讀取Object ACLObjectAcl objectAcl = ossClient.getObjectAcl("<bucketName>", "<key>");System.out.println(objectAcl.getPermission().toString());// 關閉clientossClient.shutdown();
獲取文件元信息(Object Meta)
文件元信息(Object Meta),是對用戶上傳到OSS的文件的屬性描述,分為兩種:HTTP標準屬性(HTTP Headers)和User Meta(用戶自定義元信息)。 文件元信息可以在各種方式上傳或者拷貝文件時進行設置。更多文件元信息的介紹,請參看文件元信息。
獲取文件元信息可以使用OSSClient.getSimplifiedObjectMeta或OSSClient.getObjectMetadata。getSimplifiedObjectMeta隻能獲取文件的ETag、Size(文件大小)、 LastModified(最後修改時間);getObjectMetadata能獲取文件的全部元數據。getSimplifiedObjectMeta更輕量、更快。
// endpoint以杭州為例,其它region請按實際情況填寫String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// accessKey請登錄https://ak-console.aliyun.com/#/查看String accessKeyId = "<yourAccessKeyId>";String accessKeySecret = "<yourAccessKeySecret>";// 創建OSSClient實例OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);// 獲取文件的部分元信息SimplifiedObjectMeta objectMeta = ossClient.getSimplifiedObjectMeta("<bucketName>", "<key>");System.out.println(objectMeta.getSize());System.out.println(objectMeta.getETag());System.out.println(objectMeta.getLastModified());// 獲取文件的全部元信息ObjectMetadata metadata = ossClient.getObjectMetadata("<bucketName>", "<key>");System.out.println(metadata.getContentType());System.out.println(metadata.getLastModified());System.out.println(metadata.getExpirationTime());// 關閉clientossClient.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。
// endpoint以杭州為例,其它region請按實際情況填寫String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// accessKey請登錄https://ak-console.aliyun.com/#/查看String accessKeyId = "<yourAccessKeyId>";String accessKeySecret = "<yourAccessKeySecret>";// 創建OSSClient實例OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);// 列舉ObjectObjectListing objectListing = ossClient.listObjects("<bucketName>", "<KeyPrifex>");List<OSSObjectSummary> sums = objectListing.getObjectSummaries();for (OSSObjectSummary s : sums) {System.out.println("t" + s.getKey());}// 關閉clientossClient.shutdown();
列舉出Bucket下的指定前綴的Object,最多100條object。
ObjectListing objectListing = ossClient.listObjects("<bucketName>", "<KeyPrifex>");List<OSSObjectSummary> sums = objectListing.getObjectSummaries();for (OSSObjectSummary s : sums) {System.out.println("t" + s.getKey());}
通過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) |
指定最大返回條數
// endpoint以杭州為例,其它region請按實際情況填寫String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// accessKey請登錄https://ak-console.aliyun.com/#/查看String accessKeyId = "<yourAccessKeyId>";String accessKeySecret = "<yourAccessKeySecret>";// 創建OSSClient實例OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);final int maxKeys = 200;// 列舉ObjectObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest("<bucketName>").withMaxKeys(maxKeys));List<OSSObjectSummary> sums = objectListing.getObjectSummaries();for (OSSObjectSummary s : sums) {System.out.println("t" + s.getKey());}// 關閉clientossClient.shutdown();
返回指定前綴的object
最多返回100條。
final String keyPrefix = "<keyPrefix>"ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest("<bucketName>").withPrefix(keyPrefix));List<OSSObjectSummary> sums = objectListing.getObjectSummaries();for (OSSObjectSummary s : sums) {System.out.println("t" + s.getKey());}
從指定Object後返回
不包括指定的Object,最多返回100條。
final String keyMarker = "<keyMarker>"ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest("<bucketName>").withMarker(keyMarker));List<OSSObjectSummary> sums = objectListing.getObjectSummaries();for (OSSObjectSummary s : sums) {System.out.println("t" + s.getKey());}
分頁獲取所有Object
分頁獲取所有Object,每頁maxKeys條Object。
final int maxKeys = 200;String nextMarker = null;do {objectListing = ossClient.listObjects(new ListObjectsRequest("<bucketName>").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());
分頁獲取所有特定Object後的Object
分頁獲取所有特定Object後的Object,每頁maxKeys條Object。
final int maxKeys = 200;String nextMarker = "<nextMarker>";do {objectListing = ossClient.listObjects(new ListObjectsRequest("<bucketName>").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());
分頁所有獲取指定前綴的Object
分頁所有獲取指定前綴的Object,每頁maxKeys條Object。
final int maxKeys = 200;final String keyPrefix = "<keyPrefix>";String nextMarker = "<nextMarker>";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());
指定Object名字編碼
如果Object名字含有特殊字符,如 ' " & < >、中文 等,需要進行編碼傳輸。OSS目前支持 url 編碼。
final int maxKeys = 200;final String keyPrefix = "<keyPrefix>";String nextMarker = "<nextMarker>";ObjectListing objectListing;do {ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);listObjectsRequest.setPrefix(keyPrefix);listObjectsRequest.setMaxKeys(maxKeys);listObjectsRequest.setMarker(nextMarker);// 指定Object名稱編碼傳輸listObjectsRequest.setEncodingType("url");objectListing = ossClient.listObjects(listObjectsRequest);// Object解碼for (OSSObjectSummary objectSummary: objectListing.getObjectSummaries()) {System.out.println("Key:" + URLDecoder.decode(objectSummary.getKey(), "UTF-8"));}// CommonPrefixe解碼for (String commonPrefixes: objectListing.getCommonPrefixes()) {System.out.println("CommonPrefixes:" + URLDecoder.decode(commonPrefixes, "UTF-8"));}// NextMarker解碼if (objectListing.getNextMarker() != null) {nextMarker = URLDecoder.decode(objectListing.getNextMarker(), "UTF-8");}} 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 , “/” 作為文件夾的分隔符。下麵的示例展示了如何模擬文件夾功能。
列出存儲空間內所有文件
當我們需要獲取存儲空間下的所有文件時,可以這樣寫:
// 構造ListObjectsRequest請求ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);// 列出ObjectObjectListing listing = ossClient.listObjects(listObjectsRequest);// 遍曆所有ObjectSystem.out.println("Objects:");for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {System.out.println(objectSummary.getKey());}// 遍曆所有CommonPrefixSystem.out.println("CommonPrefixs:");for (String commonPrefix : listing.getCommonPrefixes()) {System.out.println(commonPrefix);}
輸出:
Objects:fun/movie/001.avifun/movie/007.avifun/test.jpgoss.jpgCommonPrefixs:
遞歸列出目錄下所有文件
我們可以通過設置 Prefix 參數來獲取某個目錄(fun/)下所有的文件:
// 構造ListObjectsRequest請求ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);listObjectsRequest.setPrefix("fun/");// 遞歸列出fun目錄下的所有文件ObjectListing listing = ossClient.listObjects(listObjectsRequest);// 遍曆所有ObjectSystem.out.println("Objects:");for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {System.out.println(objectSummary.getKey());}// 遍曆所有CommonPrefixSystem.out.println("nCommonPrefixs:");for (String commonPrefix : listing.getCommonPrefixes()) {System.out.println(commonPrefix);}
輸出:
Objects:fun/movie/001.avifun/movie/007.avifun/test.jpgCommonPrefixs:
列出目錄下的文件和子目錄
在 Prefix 和 Delimiter 結合的情況下,可以列出目錄(fun/)下的文件和子目錄:
// 構造ListObjectsRequest請求ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);// "/" 為文件夾的分隔符listObjectsRequest.setDelimiter("/");// 列出fun目錄下的所有文件和文件夾listObjectsRequest.setPrefix("fun/");ObjectListing listing = ossClient.listObjects(listObjectsRequest);// 遍曆所有ObjectSystem.out.println("Objects:");for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {System.out.println(objectSummary.getKey());}// 遍曆所有CommonPrefixSystem.out.println("nCommonPrefixs:");for (String commonPrefix : listing.getCommonPrefixes()) {System.out.println(commonPrefix);}
輸出:
Objects:fun/test.jpgCommonPrefixs:fun/movie/
提示:
- 返回的結果中, ObjectSummaries 的列表中給出的是fun目錄下的文件。
- 而 CommonPrefixs 的列表中給出的是fun目錄下的所有子文件夾。可以看出 fun/movie/001.avi , fun/movie/007.avi 兩個文件並沒有被列出來,因為它們屬於fun文件夾下的movie目錄。
刪除文件
刪除單個文件:
您可以通過OSSClient.deleteObject刪除單個文件。
// endpoint以杭州為例,其它region請按實際情況填寫String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// accessKey請登錄https://ak-console.aliyun.com/#/查看String accessKeyId = "<yourAccessKeyId>";String accessKeySecret = "<yourAccessKeySecret>";// 創建OSSClient實例OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);// 刪除ObjectossClient.deleteObject("<bucketName>", "<key>");// 關閉clientossClient.shutdown();
刪除多個文件:
您可以通過OSSClient.deleteObjects批量刪除文件。
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() |
// endpoint以杭州為例,其它region請按實際情況填寫String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// accessKey請登錄https://ak-console.aliyun.com/#/查看String accessKeyId = "<yourAccessKeyId>";String accessKeySecret = "<yourAccessKeySecret>";// 創建OSSClient實例OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);// 刪除ObjectsList<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();// 關閉clientossClient.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。
簡單拷貝
// endpoint以杭州為例,其它region請按實際情況填寫String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// accessKey請登錄https://ak-console.aliyun.com/#/查看String accessKeyId = "<yourAccessKeyId>";String accessKeySecret = "<yourAccessKeySecret>";// 創建OSSClient實例OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);// 拷貝ObjectCopyObjectResult result = ossClient.copyObject("<srcBucketName>", "<srcKey>", "<destBucketName>", "<destKey>");System.out.println("ETag: " + result.getETag() + " LastModified: " + result.getLastModified());// 關閉clientossClient.shutdown();
通過CopyObjectRequest拷貝
也可以通過 CopyObjectRequest 實現Object的拷貝:
// endpoint以杭州為例,其它region請按實際情況填寫String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// accessKey請登錄https://ak-console.aliyun.com/#/查看String accessKeyId = "<yourAccessKeyId>";String accessKeySecret = "<yourAccessKeySecret>";// 創建OSSClient實例OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);// 創建CopyObjectRequest對象CopyObjectRequest copyObjectRequest = new CopyObjectRequest(srcBucketName, srcKey, destBucketName, destKey);// 設置新的MetadataObjectMetadata meta = new ObjectMetadata();meta.setContentType("text/html");copyObjectRequest.setNewObjectMetadata(meta);// 複製ObjectCopyObjectResult result = ossClient.copyObject(copyObjectRequest);System.out.println("ETag: " + result.getETag() + " LastModified: " + result.getLastModified());// 關閉clientossClient.shutdown();
拷貝大文件
CopyObject隻能copy小於1GB的文件,大文件需要使用分片拷貝(Upload Part Copy)。分片拷貝更詳細的說明,請參考Upload Part Copy。分片拷貝分為三步:
- 初始化分片拷貝任務
OSSClient.initiateMultipartUpload; - 分片拷貝
OSSClient.uploadPartCopy,除最後一個分片外,其它的分片大小都要大於100KB; - 提交分片拷貝任務
OSSClient.completeMultipartUpload。
提示:
- 分片拷貝的完整代碼請參考:GitHub
String sourceBucketName = "<sourceBucketName>";String sourceKey = "<sourceKey>";String targetBucketName = "<targetBucketName>";String targetKey = "<targetKey>";// 得到被拷貝object大小ObjectMetadata objectMetadata = ossClient.getObjectMetadata(sourceBucketName, sourceKey);long contentLength = objectMetadata.getContentLength();// 分片大小,10MBlong partSize = 1024 * 1024 * 10;// 計算分塊數目int partCount = (int) (contentLength / partSize);if (contentLength % partSize != 0) {partCount++;}System.out.println("total part count:" + partCount);// 初始化拷貝任務InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(targetBucketName, targetKey);InitiateMultipartUploadResult initiateMultipartUploadResult = ossClient.initiateMultipartUpload(initiateMultipartUploadRequest);String uploadId = initiateMultipartUploadResult.getUploadId();// 分片拷貝List<PartETag> partETags = new ArrayList<PartETag>();for (int i = 0; i < partCount; i++) {// 計算每個分塊的大小long skipBytes = partSize * i;long size = partSize < contentLength - skipBytes ? partSize : contentLength - skipBytes;// 創建UploadPartCopyRequestUploadPartCopyRequest uploadPartCopyRequest =new UploadPartCopyRequest(sourceBucketName, sourceKey, targetBucketName, targetKey);uploadPartCopyRequest.setUploadId(uploadId);uploadPartCopyRequest.setPartSize(size);uploadPartCopyRequest.setBeginIndex(skipBytes);uploadPartCopyRequest.setPartNumber(i + 1);UploadPartCopyResult uploadPartCopyResult = ossClient.uploadPartCopy(uploadPartCopyRequest);// 將返回的PartETag保存到List中partETags.add(uploadPartCopyResult.getPartETag());}// 提交分片拷貝任務CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(targetBucketName, targetKey, uploadId, partETags);ossClient.completeMultipartUpload(completeMultipartUploadRequest);
提示:
- 分片拷貝時,可以指定目標object的元信息,通過InitiateMultipartUploadRequest指定;
- 分片拷貝也支持限定條件,通過UploadPartCopyRequest指定。
最後更新:2016-12-09 17:54:26
上一篇:
下載文件__Java-SDK_SDK 參考_對象存儲 OSS-阿裏雲
下一篇:
授權訪問__Java-SDK_SDK 參考_對象存儲 OSS-阿裏雲
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲