追加上传是指通过AppendObject方法在已上传的追加类型文件(Appendable Object)末尾直接追加内容。
说明
- 关于追加上传的完整代码,请参见GitHub。
- 通过追加上传方式生成的Object为Appendable Object,且仅支持在Appendable Object后直接追加内容。关于追加上传的更多信息,请参见开发指南中的追加上传和API参考中的AppendObject。
使用限制
通过追加上传方式上传文件时,有如下限制:
- 当文件不存在时,调用AppendObject接口会创建一个追加类型文件。
- 当文件已存在时,如果文件为追加类型文件,且设置的追加位置和文件当前长度相等,则直接在该文件末尾追加内容;如果文件为追加类型文件,但是设置的追加位置和文件当前长度不相等,则抛出PositionNotEqualToLength异常;如果文件为非追加类型文件时,则抛出ObjectNotAppendable异常。
- 追加类型文件暂不支持CopyObject操作。
示例代码
以下代码用于追加上传文件。
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。 String endpoint = "yourEndpoint"; // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。 String accessKeyId = "yourAccessKeyId"; String accessKeySecret = "yourAccessKeySecret"; // 填写Bucket名称,例如examplebucket。 String bucketName = "examplebucket"; // 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。 String objectName = "exampledir/exampleobject.txt"; String content1 = "Hello OSS A \n"; String content2 = "Hello OSS B \n"; String content3 = "Hello OSS C \n"; // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); ObjectMetadata meta = new ObjectMetadata(); // 指定上传的内容类型。 meta.setContentType("text/plain"); // 通过AppendObjectRequest设置多个参数。 AppendObjectRequest appendObjectRequest = new AppendObjectRequest(bucketName, objectName, new ByteArrayInputStream(content1.getBytes()),meta); // 通过AppendObjectRequest设置单个参数。 // 设置Bucket名称。 //appendObjectRequest.setBucketName(bucketName); // 设置Object名称。即不包含Bucket名称在内的Object的完整路径,例如example/test.txt。 //appendObjectRequest.setKey(objectName); // 设置待追加的内容。可选类型包括InputStream类型和File类型。此处为InputStream类型。 //appendObjectRequest.setInputStream(new ByteArrayInputStream(content1.getBytes())); // 设置待追加的内容。可选类型包括InputStream类型和File类型。此处为File类型。 //appendObjectRequest.setFile(new File("D:\\localpath\\examplefile.txt")); // 指定文件的元信息,第一次追加时有效。 //appendObjectRequest.setMetadata(meta); // 第一次追加。 // 设置文件的追加位置。 appendObjectRequest.setPosition(0L); AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest); // 文件的64位CRC值。此值根据ECMA-182标准计算得出。 System.out.println(appendObjectResult.getObjectCRC()); // 第二次追加。 // nextPosition表示下一次请求中应当提供的Position,即文件当前的长度。 appendObjectRequest.setPosition(appendObjectResult.getNextPosition()); appendObjectRequest.setInputStream(new ByteArrayInputStream(content2.getBytes())); appendObjectResult = ossClient.appendObject(appendObjectRequest); // 第三次追加。 appendObjectRequest.setPosition(appendObjectResult.getNextPosition()); appendObjectRequest.setInputStream(new ByteArrayInputStream(content3.getBytes())); appendObjectResult = ossClient.appendObject(appendObjectRequest); // 关闭OSSClient。 ossClient.shutdown();
关于Bucket名称命名规范的更多信息,请参见存储空间(Bucket)。关于Object名称命名规范的更多信息,请参见对象(Object)。