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>")
// 關閉client
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:
// 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)
// 關閉client
ossClient.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 ACL
ObjectAcl objectAcl = ossClient.getObjectAcl("<bucketName>", "<key>");
System.out.println(objectAcl.getPermission().toString());
// 關閉client
ossClient.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());
// 關閉client
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。
// 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
ObjectListing objectListing = ossClient.listObjects("<bucketName>", "<KeyPrifex>");
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
for (OSSObjectSummary s : sums) {
System.out.println("t" + s.getKey());
}
// 關閉client
ossClient.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;
// 列舉Object
ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest("<bucketName>").withMaxKeys(maxKeys));
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
for (OSSObjectSummary s : sums) {
System.out.println("t" + s.getKey());
}
// 關閉client
ossClient.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);
// 列出Object
ObjectListing listing = ossClient.listObjects(listObjectsRequest);
// 遍曆所有Object
System.out.println("Objects:");
for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
System.out.println(objectSummary.getKey());
}
// 遍曆所有CommonPrefix
System.out.println("CommonPrefixs:");
for (String commonPrefix : listing.getCommonPrefixes()) {
System.out.println(commonPrefix);
}
輸出:
Objects:
fun/movie/001.avi
fun/movie/007.avi
fun/test.jpg
oss.jpg
CommonPrefixs:
遞歸列出目錄下所有文件
我們可以通過設置 Prefix 參數來獲取某個目錄(fun/)下所有的文件:
// 構造ListObjectsRequest請求
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
listObjectsRequest.setPrefix("fun/");
// 遞歸列出fun目錄下的所有文件
ObjectListing listing = ossClient.listObjects(listObjectsRequest);
// 遍曆所有Object
System.out.println("Objects:");
for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
System.out.println(objectSummary.getKey());
}
// 遍曆所有CommonPrefix
System.out.println("nCommonPrefixs:");
for (String commonPrefix : listing.getCommonPrefixes()) {
System.out.println(commonPrefix);
}
輸出:
Objects:
fun/movie/001.avi
fun/movie/007.avi
fun/test.jpg
CommonPrefixs:
列出目錄下的文件和子目錄
在 Prefix 和 Delimiter 結合的情況下,可以列出目錄(fun/)下的文件和子目錄:
// 構造ListObjectsRequest請求
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
// "/" 為文件夾的分隔符
listObjectsRequest.setDelimiter("/");
// 列出fun目錄下的所有文件和文件夾
listObjectsRequest.setPrefix("fun/");
ObjectListing listing = ossClient.listObjects(listObjectsRequest);
// 遍曆所有Object
System.out.println("Objects:");
for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
System.out.println(objectSummary.getKey());
}
// 遍曆所有CommonPrefix
System.out.println("nCommonPrefixs:");
for (String commonPrefix : listing.getCommonPrefixes()) {
System.out.println(commonPrefix);
}
輸出:
Objects:
fun/test.jpg
CommonPrefixs:
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);
// 刪除Object
ossClient.deleteObject("<bucketName>", "<key>");
// 關閉client
ossClient.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);
// 刪除Objects
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();
// 關閉client
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。
簡單拷貝
// 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
CopyObjectResult result = ossClient.copyObject("<srcBucketName>", "<srcKey>", "<destBucketName>", "<destKey>");
System.out.println("ETag: " + result.getETag() + " LastModified: " + result.getLastModified());
// 關閉client
ossClient.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);
// 設置新的Metadata
ObjectMetadata meta = new ObjectMetadata();
meta.setContentType("text/html");
copyObjectRequest.setNewObjectMetadata(meta);
// 複製Object
CopyObjectResult result = ossClient.copyObject(copyObjectRequest);
System.out.println("ETag: " + result.getETag() + " LastModified: " + result.getLastModified());
// 關閉client
ossClient.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();
// 分片大小,10MB
long 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;
// 創建UploadPartCopyRequest
UploadPartCopyRequest 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-阿裏雲