- // endpoint以杭州为例,其它region请按实际情况填写
- String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
- // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建
- String accessKeyId = "<yourAccessKeyId>";
- String accessKeySecret = "<yourAccessKeySecret>";
- String content = "Hello OSS";
- // 创建OSSClient实例
- OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
- AppendObjectRequest appendObjectRequest = new AppendObjectRequest("<yourBucketName>",
- "<yourKey>", new ByteArrayInputStream(content.getBytes()));
- // 第一次追加
- appendObjectRequest.setPosition(0L);
- AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest);
- // 第二次追加
- appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
- appendObjectResult = ossClient.appendObject(appendObjectRequest);
- // 第三次追加
- appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
- appendObjectResult = ossClient.appendObject(appendObjectRequest);
- // 关闭client
- ossClient.shutdown();
提示:
- 追加上传的次数没有限制,文件大小上限为5GB。更大的文件请使用分片上传;
- 追加类型的文件(Append Object)暂时不支持copyObject操作。
断点续传上传
当上传大文件时,如果网络不稳定或者程序崩溃了,则整个上传就失败了。用户不得不重头再来,这样做不仅浪费资源,在网络不稳定的情况下,往往重试多次还是无法完成上传。通过OSSClient.uploadFile接口来实现断点续传上传,参数是UploadFileRequest,该请求有以下参数:
- bucket 存储空间名字,必选参数,通过构造方法设置
- key 上传到OSS的Object名字,必选参数,通过构造方法设置
- uploadFile 待上传的本地文件,必选参数,通过构造方法或setUploadFile设置
- partSize 分片大小,从100KB到5GB,单位是Byte,可选参数,默认100K,通过setPartSize设置
- taskNum 分片上传并发数,可选参数,默认为1,通过setTaskNum设置
- enableCheckpoint 上传是否开启断点续传,可选参数,默认断点续传功能关闭,通过setEnableCheckpoint设置
- checkpointFile 开启断点续传时,需要在本地记录分片上传结果,如果上传失败,下次不会再上传已经成功的分片,可选参数,默认与待上传的本地文件同目录,为uploadFile.ucp,可以通过setCheckpointFile设置
- objectMetadata,Object的元数据,可选参数,用户可以通过setObjectMetadata设置
- callback 上传成功后的回调,可选参数,用户可以通过setCallback设置。
其实现的原理是将要上传的文件分成若干个分片分别上传,最后所有分片都上传成功后,完成整个文件的上传。在上传的过程中会记录当前上传的进度信息(记录在checkpoint文件中),如果上传过程中某一分片上传失败,再次上传时会从checkpoint文件中记录的点继续上传。这要求再次调用时要指定与上次相同的checkpoint文件。上传完成后,checkpoint文件会被删除。
- // endpoint以杭州为例,其它region请按实际情况填写
- String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
- // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建
- String accessKeyId = "<yourAccessKeyId>";
- String accessKeySecret = "<yourAccessKeySecret>";
- // 创建OSSClient实例
- OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
- // 设置断点续传请求
- UploadFileRequest uploadFileRequest = new UploadFileRequest("<yourBucketName>", "<yourKey>");
- // 指定上传的本地文件
- uploadFileRequest.setUploadFile("<yourLocalFile>");
- // 指定上传并发线程数
- uploadFileRequest.setTaskNum(5);
- // 指定上传的分片大小
- uploadFileRequest.setPartSize(1 * 1024 * 1024);
- // 开启断点续传
- uploadFileRequest.setEnableCheckpoint(true);
- // 断点续传上传
- ossClient.uploadFile(uploadFileRequest);
- // 关闭client
- ossClient.shutdown();
提示:
- 断点续传是分片上传的封装和加强,是用分片上传实现的;
- 文件较大或网络环境较差时,推荐使用分片上传;
- 断点续传支持指定ObjectMetadata,支持上传完成回调callback。
分片上传
对于大文件上传,可以切分成片上传。用户可以在如下的应用场景内(但不仅限于此),使用分片上传(Multipart Upload)模式:
- 需要支持断点上传。
- 上传超过100MB大小的文件。
- 网络条件较差,和OSS的服务器之间的链接经常断开。
- 上传文件之前,无法确定上传文件的大小。
分片上传(Multipart Upload)分为如下3个步骤:
- 初始化一个分片上传任务(InitiateMultipartUpload)
- 逐个或并行上传分片(UploadPart)
- 完成分片上传(CompleteMultipartUpload)或取消分片上传(AbortMultipartUpload)
分步完成Multipart Upload
提示:
初始化Multipart Upload
使用Multipart Upload模式传输数据前,必须先通知OSS初始化一个Multipart Upload事件。该操作会返回一个OSS服务器创建的全局唯一的Upload ID,用于标识本次Multipart Upload事件。用户可以根据这个ID来发起相关的操作,如中止Multipart Upload、查询Multipart Upload等。
调用OSSClient.initiateMultipartUpload初始化一个分片上传事件:
- // endpoint以杭州为例,其它region请按实际情况填写
- String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
- // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建
- String accessKeyId = "<yourAccessKeyId>";
- String accessKeySecret = "<yourAccessKeySecret>";
- String bucketName = "<yourBucketName>";
- String key = "yourKey";
- // 创建OSSClient实例
- OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
- InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, key);
- InitiateMultipartUploadResult result = ossClient.initiateMultipartUpload(request);
- String uploadId = result.getUploadId();
提示:
- 用InitiateMultipartUploadRequest指定上传文件的名字和所属存储空间(Bucket);
- 在InitiateMultipartUploadRequest中,您也可以设置ObjectMeta;
- initiateMultipartUpload 的返回结果中含有UploadId,它是区分分片上传事件的唯一标识,在后面的操作中将用到它。