管理文件__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-阿里云