更新时间:2025-08-18 15:54:16
在CDNetworks对象存储当中,用户操作的基本数据单元是对象。Java SDK提供了丰富的对象上传接口,可以通过以下方式上传对象:
其中,SDK支持上传0KB~5GB的对象。流式上传、文件上传的内容大小不能超过5GB;当上传较大文件时,请使用分段上传,分段上传每段内容大小不能超过5GB;基于表单上传提供了基于浏览器表单上传对象的方式。
若上传的对象权限设置为匿名用户读取权限,对象上传成功后,匿名用户可通过链接地址访问该对象数据。对象链接地址格式为:https://空间名.域名/文件夹目录层级/对象名。如果该对象存在于空间的根目录下,则链接地址将不需要有文件夹目录层级。
流式上传使用java.io.InputStream作为对象的数据源。您可以通过WosClient.putObject上传您的数据流。以下代码展示了如何进行流式上传:
上传字符串(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为待上传的本地文件路径,需要指定到具体的文件名
注意:上传内容大小不能超过5GB。
CDNetworks对象存储本身是没有文件夹的概念的,空间中存储的元素只有对象。创建文件夹实际上是创建了一个大小为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);
final String keySuffixWithSlash = "parent_directory/";
wosClient.putObject("bucketname", keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
// 在文件夹下创建对象
wosClient.putObject("bucketname", keySuffixWithSlash + "objectname", new ByteArrayInputStream("Hello WOS".getBytes()));
注意:
- 创建文件夹本质上来说是创建了一个大小为0且对象名以“/”结尾的对象。
- 多级文件夹创建最后一级即可,比如src1/src2/src3/,创建src1/src2/src3/即可,无需创建src1/、src1/src2/。
您可以在上传对象时设置对象属性。对象属性包含对象长度、对象MIME类型、对象MD5值(用于校验)、对象存储类型、对象自定义元数据。对象属性可以在多种上传方式下(流式上传、文件上传、分段上传),或复制对象时进行设置。
对象属性详细说明见下表:
| 名称 | 描述 | 默认值 |
|---|---|---|
| 对象长度(Content-Length) | 上传对象应小于流/文件实际长度,超出部分被截断。 | 流或文件实际长度 |
| 对象MIME类型(Content-Type) | 定义对象类型/网页编码方式,决定浏览器读取对象的形式与编码。 | application/octet-stream |
| 对象MD5值(Content-MD5) | 对象内容的MD5(Base64编码),用于服务器核验数据完整性 | 无 |
| 对象存储类型 | 对象的存储类型,不同的存储类型可以满足客户业务对存储性能、成本的不同诉求。默认与空间的存储类型保持一致,可以设置为与空间的存储类型不同。 | 无 |
| 对象自定义元数据 | 用于描述对象自定义属性,实现对象个性化管理 | 无 |
您可以通过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);
您可以通过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文件。
您可以通过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);
注意:
- 对象数据的MD5值必须经过Base64编码。
- WOS服务端会将该MD5值与对象数据计算出的MD5值进行对比,如果不匹配则上传失败,返回HTTP 400错误。
- 如果不设置对象的MD5值,WOS服务端会忽略对对象数据的MD5值校验。
- 您可以通过WosClient.base64Md5来直接计算Content-MD5头域。
您可以通过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);
注意:
- 在上面设置对象自定义元数据示例代码中,用户自定义了一个名称为“property1”,值为“property-value1”的元数据和一个名称为“property2”,值为“property-value2”的元数据。
- 一个对象可以有多个元数据,总大小不能超过8KB。
- 对象的自定义元数据可以通过WosClient.getObjectMetadata获取,参见获取对象元数据。
- 使用WosClient.getObject下载对象时,对象的自定义元数据也会同时下载。
大文件可以分片上传。建议如下场景采用分片上传:
优点
实现流程
需首先发起分片上传请求,并进行参数设置。会返回Upload ID,用于唯一标识本次分片上传。后续取消任务、查询任务、列举分片等操作都需使用此Upload ID。
使用WosClient.initiateMultipartUpload发起初始化:
参数如下:
| 参数 | 描述 | 方法 |
|---|---|---|
| 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);
注意:
- 用InitiateMultipartUploadRequest指定上传对象的名称和所属空间。
- 在InitiateMultipartUploadRequest中,您可以设置对象MIME类型、对象存储类型、对象自定义元数据等对象属性。
- InitiateMultipartUploadResult.getUploadId返回分段上传任务的全局唯一标识(Upload ID),在后面的操作中将用到它。
初始化后可指定对象名称和Upload ID上传段(也称上传分片)。每个上传的段有Part Number(范围1~10000)唯一标识。分段号不仅作用于识别,还决定合并时顺序。同编号上传会覆盖旧段号的数据。除了最后一段以外,其他段的大小范围是100KB-5GB;最后段大小范围是0-5GB。每个段不需要按顺序上传,甚至可以在不同进程、不同机器上上传,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()));
注意:
- 上传段接口要求除最后一段以外,其他的段大小都要大于100KB。但是上传段接口并不会立即校验上传段的大小(因为不知道是否为最后一块);只有调用合并段接口时才会校验。
- WOS会将服务端收到段数据的ETag值(段数据的MD5值)返回给用户。
- 为了保证数据在网络传输过程中不出现错误,可以通过设置UploadPartRequest.setAttachMd5为true来让SDK自动计算每段数据的MD5值(仅在数据源为本地文件时有效),并放到Content-MD5请求头中;WOS服务端会计算上传数据的MD5值与SDK计算的MD5值比较,保证数据完整性。
- 可以通过UploadPartRequest.setContentMd5直接设置上传数据的MD5值,提供给WOS服务端用于校验数据完整性。如果设置了该值,UploadPartRequest.setAttachMd5参数会被忽略。
- 分段号的范围是1~10000。如果超出这个范围,WOS将返回400 Bad Request错误。
所有分段上传完成后,需要调用合并段接口来在WOS服务端生成最终对象。在执行该操作时,需要提供所有有效的分段列表(包括分段号和分段ETag值);WOS收到提交的分段列表后,会逐一验证每个段的有效性。当所有段验证通过后,WOS将把这些分段组合成最终的对象。
该接口可设置的参数如下:
| 参数 | 作用 | WOS Java SDK对应方法 |
|---|---|---|
| bucketName | 存储空间名称 | initiateMultipartUpload.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);
注意:
- 上面代码中的 partEtags是进行上传段后保存的分段号和分段ETag值的列表。
- 分段可以是不连续的。
分段上传的主要目的是解决大文件上传或网络条件较差的情况。下面的示例代码展示了如何使用分段上传并发上传大文件:
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);
注意:大文件分段上传时,使用UploadPartRequest.setOffset和UploadPartRequest.setPartSize来设置每段的起始结束位置。
分段上传任务可以被取消,当一个分段上传任务被取消后,就不能再使用其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 | 分段上传任务所属的空间名称 | initiateMultipartUpload.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());
}
注意·:
- 列举段至多返回1000个段信息,如果指定的Upload ID包含的段数量大于1000,则返回结果中ListPartsResult.isTruncated为true表明本次没有返回全部段,并可通过ListPartsResult.getNextPartNumberMarker获取下次列举的起始位置。
- 如果想获取指定Upload ID包含的所有分段,可以采用分页列举的方式。
列举所有段
由于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());
}
注意:
- 列举分段上传任务至多返回1000个任务信息,如果指定的空间包含的分段上传任务数量大于1000,则MultipartUploadListing.isTruncated为true表明本次没有返回全部结果,并可通过MultipartUploadListing.getNextKeyMarker和MultipartUploadListing.getNextUploadIdMarker获取下次列举的起点。
- 如果想获取指定空间包含的所有分段上传任务,可以采用分页列举的方式。
分页列举全部分段上传任务
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生成认证参数注意:WosClient.createPostSignature生成的参数为:
以下为生成表单上传参数示例:
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>
注意:
- HTML表单中的policy,signature的值均是从WosClient.createPostSignature的返回结果中获取。
- 您可以直接下载表单HTML示例PostDemo。