开发者社区 问答 正文

Java-SDK之如何实现上传文件(三)?


  1. // endpoint以杭州为例,其它region请按实际情况填写
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String content = "Hello OSS";
  7. // 创建OSSClient实例
  8. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  9. AppendObjectRequest appendObjectRequest = new AppendObjectRequest("<yourBucketName>",
  10.         "<yourKey>", new ByteArrayInputStream(content.getBytes()));
  11. // 第一次追加
  12. appendObjectRequest.setPosition(0L);
  13. AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest);
  14. // 第二次追加
  15. appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
  16. appendObjectResult = ossClient.appendObject(appendObjectRequest);
  17. // 第三次追加
  18. appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
  19. appendObjectResult = ossClient.appendObject(appendObjectRequest);
  20. // 关闭client
  21. 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文件会被删除。
  1. // endpoint以杭州为例,其它region请按实际情况填写
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. // 创建OSSClient实例
  7. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  8. // 设置断点续传请求
  9. UploadFileRequest uploadFileRequest = new UploadFileRequest("<yourBucketName>", "<yourKey>");
  10. // 指定上传的本地文件
  11. uploadFileRequest.setUploadFile("<yourLocalFile>");
  12. // 指定上传并发线程数
  13. uploadFileRequest.setTaskNum(5);
  14. // 指定上传的分片大小
  15. uploadFileRequest.setPartSize(1 * 1024 * 1024);
  16. // 开启断点续传
  17. uploadFileRequest.setEnableCheckpoint(true);
  18. // 断点续传上传
  19. ossClient.uploadFile(uploadFileRequest);
  20. // 关闭client
  21. ossClient.shutdown();

提示:
  • 断点续传是分片上传的封装和加强,是用分片上传实现的;
  • 文件较大或网络环境较差时,推荐使用分片上传;
  • 断点续传支持指定ObjectMetadata,支持上传完成回调callback。




分片上传




对于大文件上传,可以切分成片上传。用户可以在如下的应用场景内(但不仅限于此),使用分片上传(Multipart Upload)模式:
  • 需要支持断点上传。
  • 上传超过100MB大小的文件。
  • 网络条件较差,和OSS的服务器之间的链接经常断开。
  • 上传文件之前,无法确定上传文件的大小。

分片上传(Multipart Upload)分为如下3个步骤:
  • 初始化一个分片上传任务(InitiateMultipartUpload)
  • 逐个或并行上传分片(UploadPart)
  • 完成分片上传(CompleteMultipartUpload)或取消分片上传(AbortMultipartUpload)




分步完成Multipart Upload




提示:
  • 分片上传的完整代码请参考:GitHub




初始化Multipart Upload




使用Multipart Upload模式传输数据前,必须先通知OSS初始化一个Multipart Upload事件。该操作会返回一个OSS服务器创建的全局唯一的Upload ID,用于标识本次Multipart Upload事件。用户可以根据这个ID来发起相关的操作,如中止Multipart Upload、查询Multipart Upload等。
调用OSSClient.initiateMultipartUpload初始化一个分片上传事件:
  1. // endpoint以杭州为例,其它region请按实际情况填写
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String bucketName = "<yourBucketName>";
  7. String key = "yourKey";
  8. // 创建OSSClient实例
  9. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  10. InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, key);
  11. InitiateMultipartUploadResult result = ossClient.initiateMultipartUpload(request);
  12. String uploadId = result.getUploadId();

提示:
  • 用InitiateMultipartUploadRequest指定上传文件的名字和所属存储空间(Bucket);
  • 在InitiateMultipartUploadRequest中,您也可以设置ObjectMeta;
  • initiateMultipartUpload 的返回结果中含有UploadId,它是区分分片上传事件的唯一标识,在后面的操作中将用到它。








展开
收起
青衫无名 2017-10-18 10:45:00 2321 分享 版权
0 条回答
写回答
取消 提交回答