更新时间:2022-05-24 18:28:11
本文档基于WCS Java SDK Rest V2 1.0.0版本编写。
WCS Java SDK Rest V2提供丰富的示例代码,方便您参考或直接使用。示例代码包括以下内容:
示例文件 | 示例内容 |
---|---|
DownloadSample | 下载文件 |
SimpleMultipartUploadSample | 分片上传 |
ListObjectsSample | 列举文件 |
ObjectOperationsSample | 文件操作 |
DeleteObjectsSample | 批量删除文件 |
BucketLifecycleSample | 空间生命周期 |
ConcurrentCopyPartSample | 分段并发复制大对象 |
ConcurrentDownloadObjectSample | 分段并发下载大对象 |
ConcurrentUploadPartSample | 分段并发上传大对象 |
CreateFolderSample | 创建文件夹 |
DeleteObjectsSample | 批量删除对象 |
ListBucketsSample | 列举空间 |
ListObjectsV2Sample | 列举文件 |
ObjectMetaSample | 设置文件元信息 |
PostObjectSample | 表单上传 |
RestoreObjectSample | 文件解冻 |
进行各类操作前,您需要先安装Java SDK。
前提条件
使用Java 1.7及以上版本。您可以通过命令java -version查看Java版本。
下载SDK
通过GitHub wcs-java-sdk-v2下载
安装SDK
您可以通过以下方式安装SDK。
在Intellij IDEA项目中导入JAR包
以1.0.0版本为例,步骤如下:
WosClient是Java客户端,用于管理存储空间和文件等资源。使用Java SDK发起对象操作请求,您需要初始化一个WosClient实例,并根据需要修改WosConfiguration的默认配置项。
// 请从网宿控制台-用户中心-用户信息管理-AccessKey管理处获取aksk
// 请从网宿控制台-对象存储-空间概览处获取endpoint和regionName
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
String regionName = "your regionName"
创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, config, regionName);
#### **使用访问WOS**
// 关闭wosClient
wosClient.close();
新建WosClient
新建WosClient时,需要指定Endpoint。您的工程中可以有一个或多个WosClient。WosClient可以并发使用。
配置WosClient
WosConfiguration是WosClient的配置类,您可通过此类来连接超时、最大连接数等参数。可设置的参数如下:
参数 | 描述 | 方法 |
---|---|---|
connectionTimeout | 建立HTTP/HTTPS连接的超时时间(单位:毫秒)。默认为60000毫秒。 | WosConfiguration.setConnectionTimeout |
socketTimeout | Socket层传输数据的超时时间(单位:毫秒)。默认为60000毫秒。 | WosConfiguration.setSocketTimeout |
idleConnectionTime | 如果空闲时间超过此参数的设定值,则关闭连接(单位:毫秒)。默认为30000毫秒。 | WosConfiguration.setIdleConnectionTime |
maxIdleConnections | 连接池中最大空闲连接数,默认值:1000。 | WosConfiguration.setMaxIdleConnections |
maxConnections | 最大允许的HTTP并发请求数。默认为1000。 | WosConfiguration.setMaxConnections |
maxErrorRetry | 请求失败(请求异常、服务端报500或503错误等)后最大的重试次数。默认3次。 | WosConfiguration.setMaxErrorRetry |
endPoint | 连接WOS的服务地址。可包含协议类型、域名、端口号。示例:https://your-endpoint:443。 | WosConfiguration.setEndPoint |
readBufferSize | 从Socket流下载对象的缓存大小(单位:字节),-1表示不设置缓存。默认为-1。 | WosConfiguration.setReadBufferSize |
writeBufferSize | 上传对象到Socket流时的缓存大小(单位:字节),-1表示不设置缓存。默认为-1。 | WosConfiguration.setWriteBufferSize |
本文介绍如何快速使用WCS Java SDK完成常见操作,如上传文件(Object)、下载文件等。
以下代码展示如何上传对象至WOS:
wosClient.putObject("bucketname", "objectname", new ByteArrayInputStream("Hello WOS".getBytes()));
以下代码展示如何获取对象的内容:
WosObject wosObject = wosClient.getObject("bucketname", "objectname");
InputStream content = wosObject.getObjectContent();
if (content != null)
{
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
while (true)
{
String line = reader.readLine();
if (line == null)
break;
System.out.println("\n" + line);
}
reader.close();
}
说明:
当完成一系列上传对象操作后,可能需要查看空间中包含哪些对象。以下代码展示如何列举指定空间的对象:
ObjectListing objectListing = wosClient.listObjects("bucketname");
for(WosObject wosObject : objectListing.getObjects()){
System.out.println(" - " + wosObject .getObjectKey() + " " + "(size = " + wosObject .getMetadata().getContentLength() + ")");
}
说明:
以下代码展示如何删除指定的对象:
wosClient.deleteObject("bucketname", "objectname");
使用WOS客户端进行接口调用操作完成后,没有异常抛出,则表明返回值有效,返回SDK公共响应头实例或其子类实例;若抛出异常,则说明操作失败,此时应从SDK自定义异常实例中获取错误信息。
以下代码展示了使用WOS客户端的通用方式:
// 您的工程中可以只保留一个全局的WosClient实例
// WosClient是线程安全的,可在并发场景下使用
WosClient wosClient = null;
try
{
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
wosClient = new WosClient(ak, sk, endPoint, regionName);
// 调用接口进行操作,例如上传对象
HeaderResponse response = wosClient.putObject("bucketname", "objectname", new File("localfile")); // localfile为待上传的本地文件路径,需要指定到具体的文件名
System.out.println(response);
}
catch (WosException e)
{
System.out.println("HTTP Code: " + e.getResponseCode());
System.out.println("Error Code:" + e.getErrorCode());
System.out.println("Error Message: " + e.getErrorMessage());
System.out.println("Request ID:" + e.getErrorRequestId());
System.out.println("Host ID:" + e.getErrorHostId());
}finally{
// 关闭WosClient实例,如果是全局WosClient实例,可以不在每个方法调用完成后关闭
// WosClient在调用WosClient.close方法关闭后不能再次使用
if(wosClient != null){
try
{
// wosClient.close();
}
catch (IOException e)
{
}
}
}
您可以通过WosClient.listBuckets列举空间。以下代码展示如何获取空间列表:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
// 列举空间
List<WosBucket> buckets = wosClient.listBuckets();
for(WosBucket bucket : buckets){
System.out.println("BucketName:" + bucket.getBucketName());
System.out.println("CreationDate:" + bucket.getCreationDate());
System.out.println("Endpoint:" + bucket.getEndpoint());
}
说明:
您可以通过WosClient.headBucket接口判断该空间是否已存在。以下代码展示如何判断指定空间是否存在:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
boolean exists = wosClient.headBucket("bucketname");
对象上传简介
在WOS中,用户操作的基本数据单元是对象。WOS Java SDK提供了丰富的对象上传接口,可以通过以下方式上传对象:
若上传的对象权限设置为匿名用户读取权限,对象上传成功后,匿名用户可通过链接地址访问该对象数据。对象链接地址格式为:https://空间名.域名/文件夹目录层级/对象名。如果该对象存在于空间的根目录下,则链接地址将不需要有文件夹目录层级。
流式上传使用java.io.InputStream作为对象的数据源。您可以通过WosClient.putObject上传您的数据流到WOS。以下代码展示了如何进行流式上传:
上传字符串(byte数组)
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
String content = "Hello WOS";
wosClient.putObject("bucketname", "objectname", new ByteArrayInputStream(content.getBytes()));
上传网络流
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
InputStream inputStream = new URL("http://www.a.com").openStream();
wosClient.putObject("bucketname", "objectname", inputStream);
上传文件流
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
FileInputStream fis = new FileInputStream(new File("localfile")); // 待上传的本地文件路径,需要指定到具体的文件名
wosClient.putObject("bucketname", "objectname", fis);
须知:
推荐使用文件上传的形式上传本地文件,而不是文件流形式。
大文件上传建议使用分段上传。
上传内容大小不能超过5GB。
文件上传使用本地文件作为对象的数据源。以下代码展示了如何进行文件上传:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
wosClient.putObject("bucketname", "objectname", new File("localfile")); // localfile为待上传的本地文件路径,需要指定到具体的文件名
说明:
WOS本身是没有文件夹的概念的,空间中存储的元素只有对象。创建文件夹实际上是创建了一个大小为0且对象名以“/”结尾的对象,这类对象与其他对象无任何差异,可以进行下载、删除等操作,只是WOS控制台会将这类以“/”结尾的对象以文件夹的方式展示。
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
final String keySuffixWithSlash = "parent_directory/";
wosClient.putObject("bucketname", keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
// 在文件夹下创建对象
wosClient.putObject("bucketname", keySuffixWithSlash + "objectname", new ByteArrayInputStream("Hello WOS".getBytes()));
说明:
您可以在上传对象时设置对象属性。对象属性包含对象长度、对象MIME类型、对象MD5值(用于校验)、对象存储类型、对象自定义元数据。对象属性可以在多种上传方式下(流式上传、文件上传、分段上传),或复制对象时进行设置。
对象属性详细说明见下表:
名称 | 描述 | 默认值 |
---|---|---|
对象长度(Content-Length) | 上传对象的长度,超过流/文件的长度会截断。 | 流/文件实际长度 |
对象MIME类型(Content-Type) | 对象的MIME类型,定义对象的类型及网页编码,决定浏览器将以什么形式、什么编码读取对象。 | application/octet-stream |
对象MD5值(Content-MD5) | 对象数据的MD5值(经过Base64编码),提供给WOS服务端,校验数据完整性。 | 无 |
对象存储类型 | 对象的存储类型,不同的存储类型可以满足客户业务对存储性能、成本的不同诉求。默认与空间的存储类型保持一致,可以设置为与空间的存储类型不同。 | 无 |
对象自定义元数据 | 用户对上传到空间中对象的自定义属性描述,以便对对象进行自定义管理。 | 无 |
设置对象content-length
您可以通过ObjectMetadata.setContentLength来设置对象长度。以下代码展示如何设置对象长度:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(1024 * 1024L);// 1MB
wosClient.putObject("bucketname", "objectname", new File("localfile"), metadata);
设置对象MIME类型
您可以通过ObjectMetadata.setContentType来设置对象MIME类型。以下代码展示如何设置对象MIME类型:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
// 上传图片
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("image/jpeg");
wosClient.putObject("bucketname", "objectname.jpg", new File("localimage.jpg"), metadata);
说明:如果未设置对象MIME类型,SDK会根据上传对象的后缀名自动判断对象MIME类型,如.xml判断为application/xml文件;.html判断为text/html文件。
设置对象MD5值
您可以通过ObjectMetadata.setContentMd5来设置对象MD5值。以下代码展示如何设置对象MD5值:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
// 上传图片
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentMd5("your md5 which should be encoded by base64");
wosClient.putObject("bucketname", "objectname", new File("localimage.jpg"), metadata);
说明:
设置对象存储类型
您可以通过ObjectMetadata.setObjectStorageClass来设置对象存储类型。以下代码展示如何设置对象存储类型:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
ObjectMetadata metadata = new ObjectMetadata();
// 设置对象存储类型为低频访问存储
metadata.setObjectStorageClass(StorageClassEnum.ia);
wosClient.putObject("bucketname", "objectname", new File("localfile"), metadata);
说明:
设置对象自定义元数据
您可以通过ObjectMetadata.addUserMetadata来设置对象自定义元数据。以下代码展示如何设置对象自定义元数据:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
ObjectMetadata metadata = new ObjectMetadata();
metadata.addUserMetadata("property1", "property-value1");
metadata.getMetadata().put("property2", "property-value2");
wosClient.putObject("bucketname", "objectname", new File("localfile"), metadata);
说明:
对于较大文件上传,可以切分成段上传。用户可以在如下的应用场景内(但不仅限于此),使用分段上传的模式:
上传超过100MB大小的文件。
网络条件较差,和WOS服务端之间的链接经常断开。
上传前无法确定将要上传文件的大小。
使用分段上传具有以下优势:
分段上传分为如下3个步骤:
初始化分段上传任务
使用分段上传方式传输数据前,必须先通知WOS初始化一个分段上传任务。该操作会返回一个WOS服务端创建的全局唯一标识(Upload ID),用于标识本次分段上传任务。您可以根据这个唯一标识来发起相关的操作,如取消分段上传任务、列举分段上传任务、列举已上传的段等。
您可以通过WosClient.initiateMultipartUpload初始化一个分段上传任务:
该接口可设置的参数如下:
参数 | 作用 | WOS Java SDK对应方法 |
---|---|---|
bucketName | 空间名称 | initiateMultipartUpload.setBucketName |
objectKey | 设置分段上传任务所属的对象名 | initiateMultipartUpload.setObjectKey |
expires | 设置分段上传任务最终生成对象的过期时间,正整数。 | initiateMultipartUpload.setExpires |
metadata | 设置对象属性,支持content-type,用户自定义元数据 | initiateMultipartUpload.setMetadata |
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest("bucketname", "objectname");
ObjectMetadata metadata = new ObjectMetadata();
metadata.addUserMetadata("property", "property-value");
metadata.setContentType("text/plain");
request.setMetadata(metadata);
InitiateMultipartUploadResult result = wosClient.initiateMultipartUpload(request);
String uploadId = result.getUploadId();
System.out.println("\t" + uploadId);
说明:
初始化一个分段上传任务之后,可以根据指定的对象名和Upload ID来分段上传数据。每一个上传的段都有一个标识它的号码——分段号(Part Number,范围是1~10000)。对于同一个Upload ID,该分段号不但唯一标识这一段数据,也标识了这段数据在整个对象内的相对位置。如果您用同一个分段号上传了新的数据,那么WOS上已有的这个段号的数据将被覆盖。除了最后一段以外,其他段的大小范围是100KB5GB;最后段大小范围是05GB。每个段不需要按顺序上传,甚至可以在不同进程、不同机器上上传,WOS会按照分段号排序组成最终对象。
您可以通过WosClient.uploadPart上传段:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
String uploadId = "upload id from initiateMultipartUpload";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
List<PartEtag> partEtags = new ArrayList<PartEtag>();
// 上传第一段
UploadPartRequest request = new UploadPartRequest("bucketname", "objectname");
// 设置Upload ID
request.setUploadId(uploadId);
// 设置分段号,范围是1~10000,
request.setPartNumber(1);
// 设置将要上传的大文件
request.setFile(new File("localfile"));
// 设置分段大小
request.setPartSize(5 * 1024 * 1024L);
UploadPartResult result = wosClient.uploadPart(request);
partEtags.add(new PartEtag(result.getEtag(), result.getPartNumber()));
// 上传第二段
request = new UploadPartRequest("bucketname", "objectname");
// 设置Upload ID
request.setUploadId(uploadId);
// 设置分段号
request.setPartNumber(2);
// 设置将要上传的大文件
request.setFile(new File("localfile"));
// 设置第二段的段偏移量
request.setOffset(5 * 1024 * 1024L);
// 设置分段大小
request.setPartSize(5 * 1024 * 1024L);
result = wosClient.uploadPart(request);
partEtags.add(new PartEtag(result.getEtag(), result.getPartNumber()));
说明:
所有分段上传完成后,需要调用合并段接口来在WOS服务端生成最终对象。在执行该操作时,需要提供所有有效的分段列表(包括分段号和分段ETag值);WOS收到提交的分段列表后,会逐一验证每个段的有效性。当所有段验证通过后,WOS将把这些分段组合成最终的对象。
该接口可设置的参数如下:
参数 | 作用 | WOS Java SDK对应方法 |
---|---|---|
bucketName | 空间名称 | completeMultipartUpload.setBucketName |
objectKey | 设置分段上传任务所属的对象名 | completeMultipartUpload.setObjectKey |
uploadId | 设置分段上传任务的ID号 | completeMultipartUpload.setUploadId |
partEtag | 设置待合并的段列表 | completeMultipartUpload.setPartEtag |
您可以通过WosClient.completeMultipartUpload合并段:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
String uploadId = "upload id from initiateMultipartUpload";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
List<PartEtag> partEtags = new ArrayList<PartEtag>();
// 第一段
PartEtag part1 = new PartEtag();
part1.setPartNumber(1);
part1.seteTag("etag1");
partEtags.add(part1);
// 第二段
PartEtag part2 = new PartEtag();
part2.setPartNumber(2);
part2.setEtag("etag2");
partEtags.add(part2);
CompleteMultipartUploadRequest request = new CompleteMultipartUploadRequest("bucketname", "objectname", uploadId, partEtags);
wosClient.completeMultipartUpload(request);
说明:
分段上传的主要目的是解决大文件上传或网络条件较差的情况。下面的示例代码展示了如何使用分段上传并发上传大文件:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
final String bucketName = "bucketname";
final String objectKey = "objectname";
// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
// 初始化线程池
ExecutorService executorService = Executors.newFixedThreadPool(20);
final File largeFile = new File("localfile");
// 初始化分段上传任务
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectKey);
InitiateMultipartUploadResult result = wosClient.initiateMultipartUpload(request);
final String uploadId = result.getUploadId();
System.out.println("\t"+ uploadId + "\n");
// 每段上传100MB
long partSize = 100 * 1024 * 1024L;
long fileSize = largeFile.length();
// 计算需要上传的段数
long partCount = fileSize % partSize == 0 ? fileSize / partSize : fileSize / partSize + 1;
final List<PartEtag> partEtags = Collections.synchronizedList(new ArrayList<PartEtag>());
// 执行并发上传段
for (int i = 0; i < partCount; i++)
{
// 分段在文件中的起始位置
final long offset = i * partSize;
// 分段大小
final long currPartSize = (i + 1 == partCount) ? fileSize - offset : partSize;
// 分段号
final int partNumber = i + 1;
executorService.execute(new Runnable()
{
@Override
public void run()
{
UploadPartRequest uploadPartRequest = new UploadPartRequest();
uploadPartRequest.setBucketName(bucketName);
uploadPartRequest.setObjectKey(objectKey);
uploadPartRequest.setUploadId(uploadId);
uploadPartRequest.setFile(largeFile);
uploadPartRequest.setPartSize(currPartSize);
uploadPartRequest.setOffset(offset);
uploadPartRequest.setPartNumber(partNumber);
UploadPartResult uploadPartResult;
try
{
uploadPartResult = wosClient.uploadPart(uploadPartRequest);
System.out.println("Part#" + partNumber + " done\n");
partEtags.add(new PartEtag(uploadPartResult.getEtag(), uploadPartResult.getPartNumber()));
}
catch (WosException e)
{
e.printStackTrace();
}
}
});
}
// 等待上传完成
executorService.shutdown();
while (!executorService.isTerminated())
{
try
{
executorService.awaitTermination(5, TimeUnit.SECONDS);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
// 合并段
CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, objectKey, uploadId, partEtags);
wosClient.completeMultipartUpload(completeMultipartUploadRequest);
说明:
分段上传任务可以被取消,当一个分段上传任务被取消后,就不能再使用其Upload ID做任何操作,已经上传段也会被WOS删除。
采用分段上传方式上传对象过程中或上传对象失败后会在空间内产生段,这些段会占用您的存储空间,您可以通过取消该分段上传任务来清理掉不需要的段,节约存储空间。
您可以通过WosClient.abortMultipartUpload取消分段上传任务:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
String uploadId = "upload id from initiateMultipartUpload";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
AbortMultipartUploadRequest request = new AbortMultipartUploadRequest("bucketname", "objectname", uploadId);
wosClient.abortMultipartUpload(request);
您可使用WosClient.listParts列举出某一分段上传任务所有已经上传成功的段。
该接口可设置的参数如下:
参数 | 作用 | WOS Java SDK对应方法 |
---|---|---|
bucketName | 分段上传任务所属的空间名称。 | ListPartsRequest.setBucketName |
key | 分段上传任务所属的对象名。 | ListPartsRequest.setKey |
uploadId | 分段上传任务全局唯一标识,从WosClient.initiateMultipartUpload返回的结果获取。 | ListPartsRequest.setUploadId |
maxParts | 表示列举已上传的段返回结果最大段数目,即分页时每一页中段数目。 | ListPartsRequest.setMaxParts |
partNumberMarker | 表示待列出段的起始位置,只有Part Number大于该参数的段会被列出。 | ListPartsRequest.setPartNumberMarker |
简单列举
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
String uploadId = "upload id from initiateMultipartUpload";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
//列举已上传的段,其中uploadId来自于initiateMultipartUpload
ListPartsRequest request = new ListPartsRequest("bucketname", "objectname");
request.setUploadId(uploadId);
ListPartsResult result = wosClient.listParts(request);
for(Multipart part : result.getMultipartList()){
// 分段号,上传时候指定
System.out.println("\t"+part.getPartNumber());
// 段数据大小
System.out.println("\t"+part.getSize());
// 分段的ETag值
System.out.println("\t"+part.getEtag());
// 段的最后上传时间
System.out.println("\t"+part.getLastModified());
}
说明:
列举所有段
由于WosClient.listParts只能列举至多1000个段,如果段数量大于1000,列举所有分段请参考如下示例:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
String uploadId = "upload id from initiateMultipartUpload";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
// 列举所有已上传的段,其中uploadId来自于initiateMultipartUpload
ListPartsRequest request = new ListPartsRequest("bucketname", "objectname");
request.setUploadId(uploadId);
ListPartsResult result;
do{
result = wosClient.listParts(request);
for(Multipart part : result.getMultipartList()){
// 分段号,上传时候指定
System.out.println("\t"+part.getPartNumber());
// 段数据大小
System.out.println("\t"+part.getSize());
// 分段的ETag值
System.out.println("\t"+part.getEtag());
// 段的最后上传时间
System.out.println("\t"+part.getLastModified());
}
request.setPartNumberMarker(Integer.parseInt(result.getNextPartNumberMarker()));
}while(result.isTruncated());
您可以通过WosClient.listMultipartUploads列举分段上传任务。列举分段上传任务可设置的参数如下:
参数 | 作用 | WOS Java SDK对应方法 |
---|---|---|
bucketName | 空间名称 | ListMultipartUploadsRequest.setBucketName |
prefix | 限定返回的分段上传任务中的对象名必须带有prefix前缀。 | ListMultipartUploadsRequest.setPrefix |
delimiter | 用于对分段上传任务中的对象名进行分组的字符。对于对象名中包含delimiter的任务,其对象名(如果请求中指定了prefix,则此处的对象名需要去掉prefix)中从首字符至第一个delimiter之间的字符串将作为一个分组并作为commonPrefix返回。 | ListMultipartUploadsRequest.setDelimiter |
maxUploads | 列举分段上传任务的最大数目,取值范围为1~1000,当超出范围时,按照默认的1000进行处理。 | ListMultipartUploadsRequest.setMaxUploads |
keyMarker | 表示列举时返回指定的keyMarker之后的分段上传任务。 | ListMultipartUploadsRequest.setKeyMarker |
uploadIdMarker | 只有与keyMarker参数一起使用时才有意义,用于指定返回结果的起始位置,即列举时返回指定keyMarker的uploadIdMarker之后的分段上传任务。 | ListMultipartUploadsRequest.setUploadIdMarker |
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
String uploadId = "upload id from initiateMultipartUpload";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
ListMultipartUploadsRequest request = new ListMultipartUploadsRequest("bucketname");
MultipartUploadListing result = wosClient.listMultipartUploads(request);
for(MultipartUpload upload : result.getMultipartTaskList()){
System.out.println("\t" + upload.getUploadId());
System.out.println("\t" + upload.getObjectKey());
System.out.println("\t" + upload.getInitiatedDate());
}
说明:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
String uploadId = "upload id from initiateMultipartUpload";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
ListMultipartUploadsRequest request = new ListMultipartUploadsRequest("bucketname");
MultipartUploadListing result;
do{
result = wosClient.listMultipartUploads(request);
for(MultipartUpload upload : result.getMultipartTaskList()){
System.out.println("\t" + upload.getUploadId());
System.out.println("\t" + upload.getObjectKey());
System.out.println("\t" + upload.getInitiatedDate());
}
request.setKeyMarker(result.getNextKeyMarker());
request.setUploadIdMarker(result.getNextUploadIdMarker());
}while(result.isTruncated());
基于表单上传是使用HTML表单形式上传对象到指定空间中,对象最大不能超过5GB。
您可以通过WosClient.createPostSignature生成基于表单上传的请求参数。使用代码模拟表单上传的完整代码示例,参见PostObjectSample。您也可以通过如下步骤进行表单上传:
使用WosClient.createPostSignature生成用于鉴权的请求参数。
准备表单HTML页面。
将生成的请求参数填入HTML页面。
选择本地文件,进行表单上传。
说明:
使用SDK生成用于鉴权的请求参数包括两个:
policy,对应表单中policy字段。
signature,对应表单中的signature字段。
以下代码展示了如何生成基于表单上传的请求参数:
String endPoint = "http://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
PostSignatureRequest request = new PostSignatureRequest();
// 设置表单参数
Map<String, Object> formParams = new HashMap<String, Object>();
// 设置对象访问权限为公共读
formParams.put("x-wos-acl", "public-read");
// 设置对象MIME类型
formParams.put("content-type", "text/plain");
request.setFormParams(formParams);
// 设置表单上传请求有效期,单位:秒
request.setExpires(3600);
PostSignatureResponse response = wosClient.createPostSignature(request);
formParams.put("key", objectKey);
formParams.put("policy", response.getPolicy());
formParams.put("accesskeyid", ak);
formParams.put("x-wos-credential", response.getCredential());
formParams.put("x-wos-algorithm", response.getAlgorithm());
formParams.put("bucket", bucketName);
formParams.put("x-wos-date", response.getDate());
formParams.put("x-wos-signature", response.getSignature());
// 获取表单上传请求参数
System.out.println("\t" + response.getPolicy());
System.out.println("\t" + response.getSignature());
示例表单HTML代码如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<form action="http://bucketname.your-endpoint/" method="post" enctype="multipart/form-data">
Object key
<!-- 对象名 -->
<input type="text" name="key" value="objectname" />
<p>
ACL
<!-- 对象ACL权限 -->
<input type="text" name="x-wos-acl" value="public-read" />
<p>
Content-Type
<!-- 对象MIME类型 -->
<input type="text" name="content-type" value="text/plain" />
<p>
<!-- policy的base64编码值 -->
<input type="hidden" name="policy" value="*** Provide your policy ***" />
<!-- AK -->
<input type="hidden" name="AccessKeyId" value="*** Provide your access key ***"/>
<!-- 签名串信息 -->
<input type="hidden" name="signature" value="*** Provide your signature ***"/>
<input name="file" type="file" />
<input name="submit" value="Upload" type="submit" />
</form>
</body>
</html>
说明:
对象下载简介
WOS Java SDK提供了丰富的对象下载接口,您可以通过WosClient.getObject下载对象。
以下代码展示了如何进行流式下载:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
WosObject wosObject = WosClient.getObject("bucketname", "objectname");
// 读取对象内容
System.out.println("Object content:");
InputStream input = wosObject.getObjectContent();
byte[] b = new byte[1024];
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int len;
while ((len=input.read(b)) != -1){
bos.write(b, 0, len);
}
System.out.println(new String(bos.toByteArray()));
bos.close();
input.close();
说明:
须知:
如果只需要下载对象的其中一部分数据,可以使用范围下载,下载指定范围的数据。如果指定的下载范围是0~1000,则返回第0到第1000个字节的数据,包括第1000个,共1001字节的数据,即[0, 1000]。如果指定的范围无效,则返回整个对象的数据。以下代码展示了如何进行范围下载:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
GetObjectRequest request = new GetObjectRequest("bucketname", "objectname");
// 指定开始和结束范围
request.setRangeStart(0l);
request.setRangeEnd(1000l);
WosObject wosObject = wosClient.getObject(request);
// 读取数据
byte[] buf = new byte[1024];
InputStream in = wosObject.getObjectContent();
for (int n = 0; n != -1; ) {
n = in.read(buf, 0, buf.length);
}
in.close();
说明:
下载对象时,可以指定一个或多个限定条件,满足限定条件时则进行下载,否则抛出异常,下载对象失败。
您可以使用的限定条件如下:
参数 | 作用 | WOS Java SDK对应方法 |
---|---|---|
If-Modified-Since | 如果对象的修改时间晚于该参数值指定的时间,则返回对象内容,否则抛出异常。 | GetObjectRequest.setIfModifiedSince |
If-Unmodified-Since | 如果对象的修改时间早于该参数值指定的时间,则返回对象内容,否则抛出异常。 | GetObjectRequest.setIfUnmodifiedSince |
If-Match | 如果对象的ETag值与该参数值相同,则返回对象内容,否则抛出异常。 | GetObjectRequest.setIfMatchTag |
If-None-Match | 如果对象的ETag值与该参数值不相同,则返回对象内容,否则抛出异常。 | GetObjectRequest.setIfNoneMatchTag |
说明:
以下代码展示了如何进行限定条件下载:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
GetObjectRequest request = new GetObjectRequest("bucketname", "objectname");
request.setRangeStart(0l);
request.setRangeEnd(1000l);
request.setIfModifiedSince(new SimpleDateFormat("yyyy-MM-dd").parse("2016-01-01"));
WosObject wosObject = wosClient.getObject(request);
wosObject.getObjectContent().close();
下载对象时,可以重写部分HTTP/HTTPS响应头信息。可重写的响应头信息见下表:
参数 | 作用 | WOS Java SDK对应方法 |
---|---|---|
contentType | 重写HTTP/HTTPS响应中的Content-Type | ObjectRepleaceMetadata.setContentType |
contentLanguage | 重写HTTP/HTTPS响应中的Content-Language | ObjectRepleaceMetadata.setContentLanguage |
expires | 重写HTTP/HTTPS响应中的Expires | ObjectRepleaceMetadata.setExpires |
cacheControl | 重写HTTP/HTTPS响应中的Cache-Control | ObjectRepleaceMetadata.setCacheControl |
contentDisposition | 重写HTTP/HTTPS响应中的Content-Disposition | ObjectRepleaceMetadata.setContentDisposition |
contentEncoding | 重写HTTP/HTTPS响应中的Content-Encoding | ObjectRepleaceMetadata.setContentEncoding |
以下代码展示了如何重写响应头:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
GetObjectRequest request = new GetObjectRequest("bucketname", "objectname");
ObjectRepleaceMetadata replaceMetadata = new ObjectRepleaceMetadata();
replaceMetadata.setContentType("image/jpeg");
request.setReplaceMetadata(replaceMetadata);
WosObject wosObject = wosClient.getObject(request);
System.out.println(wosObject.getMetadata().getContentType());
wosObject.getObjectContent().close();
下载对象成功后会返回对象的自定义元数据。以下代码展示了如何获取自定义元数据:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
// 上传对象,设置自定义元数据
PutObjectRequest request = new PutObjectRequest("bucketname", "objectname");
ObjectMetadata metadata = new ObjectMetadata();
metadata.addUserMetadata("property", "property-value");
request.setMetadata(metadata);
wosClient.putObject(request);
// 下载对象,获取对象自定义元数据
WosObject wosObject = wosClient.getObject("bucketname", "objectname");
System.out.println(wosObject.getMetadata().getUserMetadata("property"));
wosObject.getObjectContent().close();
如果要下载归档存储对象,需要先将归档存储对象取回,您可以通过WosClient.restoreObject取回归档存储对象。以下代码展示了如何下载归档存储对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
RestoreObjectRequest request = new RestoreObjectRequest();
request.setBucketName("bucketname");
request.setObjectKey("objectname");
request.setDays(1);
wosClient.restoreObject(request);
// 等待对象取回
Thread.sleep(60 * 6 * 1000);
// 下载对象
WosObject wosObject = wosClient.getObject("bucketname", "objectname");
wosObject.getObjectContent().close();
说明:
您可以通过WosClient.setObjectMetadata来设置对象属性,包括对象自定义元数据等信息。以下代码展示了如何设置对象属性:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
SetObjectMetadataRequest request = new SetObjectMetadataRequest("bucketname", "objectname");
request.addUserMetadata("property1", "property-value1");
// 设置自定义元数据
ObjectMetadata metadata = wosClient.setObjectMetadata(request);
System.out.println("\t" + metadata.getUserMetadata("property1"));
您可以通过WosClient.getObjectMetadata来获取对象属性,包括对象长度,对象MIME类型,对象自定义元数据等信息。以下代码展示了如何获取对象属性:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
ObjectMetadata metadata = wosClient.getObjectMetadata("bucketname", "objectname");
System.out.println("\t" + metadata.getContentType());
System.out.println("\t" + metadata.getContentLength());
System.out.println("\t" + metadata.getUserMetadata("property"));
您可以通过WosClient.getObjectAcl获取对象的访问权限。以下代码展示如何获取对象访问权限:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
AccessControlList acl = wosClient.getObjectAcl("bucketname", "objectname");
System.out.println(acl);
您可以通过WosClient.listObjects列举出空间里的对象。
该接口可设置的参数如下:
参数 | 作用 | WOS Java SDK对应方法 |
---|---|---|
bucketName | 空间名称 | ListObjectsRequest.setBucketName |
prefix | 限定返回的对象名必须带有prefix前缀。 | ListObjectsRequest.setPrefix |
marker | 列举对象的起始位置,返回的对象列表将是对象名按照字典序排序后该参数以后的所有对象。 | ListObjectsRequest.setMarker |
maxKeys | 列举对象的最大数目,取值范围为1~1000,当超出范围时,按照默认的1000进行处理。 | ListObjectsRequest.setMaxKeys |
delimiter | 用于对对象名进行分组的字符。对于对象名中包含delimiter的对象,其对象名(如果请求中指定了prefix,则此处的对象名需要去掉prefix)中从首字符至第一个delimiter之间的字符串将作为一个分组并作为commonPrefix返回。 | ListObjectsRequest.setDelimiter |
简单列举
以下代码展示如何简单列举对象,最多返回1000个对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
ObjectListing result = wosClient.listObjects("bucketname");
for(WosObject wosObject : result.getObjects()){
System.out.println("\t" + wosObject.getObjectKey());
System.out.println("\t" + wosObject.getOwner());
}
说明:
指定数目列举
以下代码展示如何指定数目列举对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
ListObjectsRequest request = new ListObjectsRequest("bucketname");
// 只列举100个对象
request.setMaxKeys(100);
ObjectListing result = wosClient.listObjects(request);
for(WosObject wosObject : result.getObjects()){
System.out.println("\t" + wosObject.getObjectKey());
System.out.println("\t" + wosObject.getOwner());
}
指定前缀列举
以下代码展示如何指定前缀列举对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
ListObjectsRequest request = new ListObjectsRequest("bucketname");
// 设置列举带有prefix前缀的100个对象
request.setMaxKeys(100);
request.setPrefix("prefix");
ObjectListing result = wosClient.listObjects(request);
for(WosObject wosObject : result.getObjects()){
System.out.println("\t" + wosObject.getObjectKey());
System.out.println("\t" + wosObject.getOwner());
}
指定起始位置列举
以下代码展示如何指定起始位置列举对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
ListObjectsRequest request = new ListObjectsRequest("bucketname");
// 设置列举对象名字典序在"test"之后的100个对象
request.setMaxKeys(100);
request.setMarker("test");
ObjectListing result = wosClient.listObjects(request);
for(WosObject wosObject : result.getObjects()){
System.out.println("\t" + wosObject.getObjectKey());
System.out.println("\t" + wosObject.getOwner());
}
分页列举全部对象
以下代码展示分页列举全部对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
ListObjectsRequest request = new ListObjectsRequest("bucketname");
// 设置每页100个对象
request.setMaxKeys(100);
ObjectListing result;
do{
result = wosClient.listObjects(request);
for(WosObject wosObject : result.getObjects()){
System.out.println("\t" + wosObject.getObjectKey());
System.out.println("\t" + wosObject.getOwner());
}
request.setMarker(result.getNextMarker());
}while(result.isTruncated());
列举文件夹中的所有对象
WOS本身是没有文件夹的概念的,空间中存储的元素只有对象。文件夹对象实际上是一个大小为0且对象名以“/”结尾的对象,将这个文件夹对象名作为前缀,即可模拟列举文件夹中对象的功能。以下代码展示如何列举文件夹中的对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
ListObjectsRequest request = new ListObjectsRequest("bucketname");
// 设置文件夹对象名"dir/"为前缀
request.setPrefix("dir/");
request.setMaxKeys(1000);
ObjectListing result;
do{
result = wosClient.listObjects(request);
for (WosObject wosObject : result.getObjects())
{
System.out.println("\t" + wosObject.getObjectKey());
System.out.println("\t" + wosObject.getOwner());
}
request.setMarker(result.getNextMarker());
}while(result.isTruncated());
按文件夹分组列举所有对象
以下代码展示如何按文件夹分组,列举空间内所有对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
ListObjectsRequest request = new ListObjectsRequest("bucketname");
request.setMaxKeys(1000);
// 设置文件夹分隔符"/"
request.setDelimiter("/");
ObjectListing result = wosClient.listObjects(request);
System.out.println("Objects in the root directory:");
for(WosObject wosObject : result.getObjects()){
System.out.println("\t" + wosObject.getObjectKey());
System.out.println("\t" + wosObject.getOwner());
}
listObjectsByPrefix(wosClient, request, result);
递归列出子文件夹中对象的函数listObjectsByPrefix的示例代码如下:
static void listObjectsByPrefix(WosClient wosClient, ListObjectsRequest request, ObjectListing result) throws WosException
{
for(String prefix : result.getCommonPrefixes()){
System.out.println("Objects in folder [" + prefix + "]:");
request.setPrefix(prefix);
result = wosClient.listObjects(request);
for(WosObject wosObject : result.getObjects()){
System.out.println("\t" + wosObject.getObjectKey());
System.out.println("\t" + wosObject.getOwner());
}
listObjectsByPrefix(wosClient, request, result);
}
}
说明:
删除单个对象
您可以通过WosClient.deleteObject删除单个对象。以下代码展示如何删除单个对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
wosClient.deleteObject("bucketname", "objectname");
批量删除对象
您可以通过WosClient.deleteObjects批量删除对象,每次最多删除1000个对象。
以下代码展示了如何进行批量删除空间内所有对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
DeleteObjectsRequest deleteRequest = new DeleteObjectsRequest("bucketname");
wosClient.deleteObjects(deleteRequest);
复制对象即为WOS上已经存在的对象创建一个副本。
您可以通过WosClient.copyObject来复制对象。复制对象时,可重新指定新对象的属性和设置对象权限,且支持条件复制。
操作限制
简单复制
以下代码展示了如何进行简单复制:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
try{
CopyObjectResult result = wosClient.copyObject("sourcebucketname", "sourceobjectname", "destbucketname", "destobjectname");
System.out.println("\t" + result.getStatusCode());
System.out.println("\t" + result.getEtag());
}
catch (WosException e)
{
// 复制失败
System.out.println("HTTP Code: " + e.getResponseCode());
System.out.println("Error Code:" + e.getErrorCode());
System.out.println("Error Message: " + e.getErrorMessage());
System.out.println("Request ID:" + e.getErrorRequestId());
System.out.println("Host ID:" + e.getErrorHostId());
}
重写对象属性
以下代码展示了如何在复制对象时重写对象属性:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
CopyObjectRequest request = new CopyObjectRequest("sourcebucketname", "sourceobjectname", "destbucketname", "destobjectname");
// 设置进行对象属性重写
request.setReplaceMetadata(true);
ObjectMetadata newObjectMetadata = new ObjectMetadata();
newObjectMetadata.setContentType("image/jpeg");
newObjectMetadata.addUserMetadata("property", "property-value");
newObjectMetadata.setObjectStorageClass(StorageClassEnum.WARM);
request.setNewObjectMetadata(newObjectMetadata);
CopyObjectResult result = wosClient.copyObject(request);
System.out.println("\t" + result.getEtag());
说明:
限定条件复制
复制对象时,可以指定一个或多个限定条件,满足限定条件时则进行复制,否则抛出异常,复制对象失败。
您可以使用的限定条件如下:
参数 | 作用 | WOS Java SDK对应方法 |
---|---|---|
Copy-Source-If-Modified-Since | 如果源对象的修改时间晚于该参数值指定的时间,则进行复制,否则抛出异常。 | CopyObjectRequest.setIfModifiedSince |
Copy-Source-If-Unmodified-Since | 如果源对象的修改时间早于该参数值指定的时间,则进行复制,否则抛出异常。 | CopyObjectRequest.setIfUnmodifiedSince |
Copy-Source-If-Match | 如果源对象的ETag值与该参数值相同,则进行复制,否则抛出异常。 | CopyObjectRequest.setIfMatchTag |
Copy-Source-If-None-Match | 如果源对象的ETag值与该参数值不相同,则进行复制,否则抛出异常。 | CopyObjectRequest.setIfNoneMatchTag |
说明:
以下代码展示了如何进行限定条件复制:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
CopyObjectRequest request = new CopyObjectRequest("sourcebucketname", "sourceobjectname", "destbucketname", "destobjectname");
request.setIfModifiedSince(new SimpleDateFormat("yyyy-MM-dd").parse("2016-01-01"));
request.setIfNoneMatchTag("none-match-etag");
CopyObjectResult result = wosClient.copyObject(request);
System.out.println("\t" + result.getEtag());
分段复制
分段复制是分段上传的一种特殊情况,即分段上传任务中的段通过复制WOS指定空间中现有对象(或对象的一部分)来实现。您可以通过WosClient.copyPart来复制段。以下代码展示了如何使用分段复制模式复制大对象:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
final String destBucketName = "destbucketname";
final String destObjectKey = "destobjectname";
final String sourceBucketName = "sourcebucketname";
final String sourceObjectKey = "sourceobjectname";
// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
// 初始化线程池
ExecutorService executorService = Executors.newFixedThreadPool(20);
// 初始化分段上传任务
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(destBucketName, destObjectKey);
InitiateMultipartUploadResult result = wosClient.initiateMultipartUpload(request);
final String uploadId = result.getUploadId();
System.out.println("\t"+ uploadId + "\n");
// 获取大对象信息
ObjectMetadata metadata = wosClient.getObjectMetadata(sourceBucketName, sourceObjectKey);
// 每段复制100MB
long partSize = 100 * 1024 * 1024L;
long objectSize = metadata.getContentLength();
// 计算需要复制的段数
long partCount = objectSize % partSize == 0 ? objectSize / partSize : objectSize / partSize + 1;
final List<PartEtag> partEtags = Collections.synchronizedList(new ArrayList<PartEtag>());
// 执行并发复制段
for (int i = 0; i < partCount; i++)
{
// 复制段起始位置
final long rangeStart = i * partSize;
// 复制段结束位置
final long rangeEnd = (i + 1 == partCount) ? objectSize - 1 : rangeStart + partSize - 1;
// 分段号
final int partNumber = i + 1;
executorService.execute(new Runnable()
{
@Override
public void run()
{
CopyPartRequest request = new CopyPartRequest();
request.setUploadId(uploadId);
request.setSourceBucketName(sourceBucketName);
request.setSourceObjectKey(sourceObjectKey);
request.setDestinationBucketName(destBucketName);
request.setDestinationObjectKey(destObjectKey);
request.setByteRangeStart(rangeStart);
request.setByteRangeEnd(rangeEnd);
request.setPartNumber(partNumber);
CopyPartResult result;
try
{
result = wosClient.copyPart(request);
System.out.println("Part#" + partNumber + " done\n");
partEtags.add(new PartEtag(result.getEtag(), result.getPartNumber()));
}
catch (WosException e)
{
e.printStackTrace();
}
}
});
}
// 等待复制完成
executorService.shutdown();
while (!executorService.isTerminated())
{
try
{
executorService.awaitTermination(5, TimeUnit.SECONDS);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
// 合并段
CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(destBucketName, destObjectKey, uploadId, partEtags);
wosClient.completeMultipartUpload(completeMultipartUploadRequest);
生命周期管理简介
WOS允许您对空间设置生命周期规则,实现自动转换对象的存储类型、自动淘汰过期的对象,以有效利用存储特性,优化存储空间。针对不同前缀的对象,您可以同时设置多条规则。一条规则包含:
您可以通过WosClient.setBucketLifecycleConfiguration设置空间的生命周期规则。
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
final String ruleId = "delete obsoleted files";
final String matchPrefix = "obsoleted/";
StringBuffer sb = new StringBuffer();
LifecycleConfiguration lifecycleConfig = new LifecycleConfiguration();
LifecycleConfiguration.Rule rule = lifecycleConfig.new Rule();
rule.setEnabled(true);
rule.setId(ruleId);
rule.setPrefix(matchPrefix);
LifecycleConfiguration.Expiration expiration = lifecycleConfig.new Expiration();
expiration.setDays(10);
rule.setExpiration(expiration);
lifecycleConfig.addRule(rule);
sb.append("Setting bucket lifecycle\n\n");
HeaderResponse headerResponse = wosClient.setBucketLifecycleConfiguration(bucketName, lifecycleConfig);
System.out.println(headerResponse);
您可以通过WosClient.getBucketLifecycle查看空间的生命周期规则。以下代码展示了如何查看空间的生命周期规则:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
LifecycleConfiguration config = wosClient.getBucketLifecycle("bucketname");
for (Rule rule : config.getRules())
{
System.out.println(rule.getId());
System.out.println(rule.getPrefix());
for(Transition transition : rule.getTransitions()){
System.out.println(transition.getDays());
System.out.println(transition.getStorageClass());
}
System.out.println(rule.getExpiration() != null ? rule.getExpiration().getDays() : "");
}
您可以通过WosClient.deleteBucketLifecycle删除空间的生命周期规则。以下代码展示了如何删除空间的生命周期规则:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
wosClient.deleteBucketLifecycle("bucketname");