使用Java SDK实现断点续传 本文介绍通过使用Java SDK实现断点续传的最佳实践。 当上传大文件时,经常出现因网络不稳定或程序崩溃导致上传失败的情况。失败后再次重新上传不仅浪费资源,而且当网络不稳定时仍然有上传失败的风险。断点续传上传接口uploadFile能有效地解决此类问题引起的上传效率低下的问题。其原理是将待上传的文件分成若干个分片分别上传,如果出现网络异常或程序崩溃导致文件上传失败时,会将中断对象的断点处记录下来,从而能在失败重传时继续上传未上传完成的部分,节省资源提高效率,还因其能够对分片进行并发上传的机制能加快上传速度。 本文主要介绍通过Java SDK实现断点续传。SDK下载地址:SDK概览。 注意事项 断点续传上传,您必须必须是桶拥有者或拥有上传对象的权限,才能上传对象。 断点续传上传接口传入的文件大小至少要5MB以上,因为最小的分片大小就是5MB。 使用SDK的断点续传接口时,必须开启断点续传选项setEnableCheckpoint为true才能在再次上传同一对象时读取到之前的上传进度。 您可实现ProgressListener接口来实现对上传进度的监控。 示例代码 断点续传 以下为断点续传示例代码。 java public class ResumeUploadDemo { private static String endpoint " private static String accessKeyId "ak";// 主账号或子账号ak private static String accessKeySecret "sk";// 主账号或子账号sk private static String bucketName "bucket";// 上传对象的目标bucket private static String key "xx.xx";// 对象名 private static String uploadFile "xx.xx";// 本地待上传文件路径 public static void main(String[] args) { ClientConfiguration clientConfiguration new ClientConfiguration(); BasicAWSCredentials credentials new BasicAWSCredentials(accessKeyId, accessKeySecret); AWSStaticCredentialsProvider credProvider new AWSStaticCredentialsProvider(credentials); AwsClientBuilder.EndpointConfiguration endpointConfiguration new AwsClientBuilder.EndpointConfiguration( endpoint, Regions.DEFAULTREGION.getName()); AmazonS3 s3Client AmazonS3ClientBuilder.standard() .withCredentials(credProvider) .withClientConfiguration(clientConfiguration) .withEndpointConfiguration(endpointConfiguration) .withPathStyleAccessEnabled(false) .build(); try { // 通过UploadFileRequest设置多个参数。 // 依次填写Bucket名称以及对象名称。 UploadFileRequest uploadFileRequest new UploadFileRequest(bucketName, key); // 指定监听器,当您实现以上接口后,可在这设置您的进度监控实例,从而完成对于上传进度的监控。 uploadFileRequest.setProgressListener(progressListener); // 填写本地文件的完整路径,例如D:localpathexamplefile.txt。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。 uploadFileRequest.setUploadFile(uploadFile); // 指定上传并发线程数,默认值为1。 uploadFileRequest.setTaskNum(5); // 指定上传的分片大小,单位为字节。默认值为5 MB。 uploadFileRequest.setPartSize(1024 1024 5); // 开启断点续传,默认关闭。开启后,上传过程中的进度信息会保存在文件中,默认与待上传的本地文件同路径,名称为${uploadFile}.ucp,如果某一分片上传失败,再次上传时会根据文件中记录的点继续上传。上传完成后,该文件会被删除。 uploadFileRequest.setEnableCheckpoint(true); try { UploadFileResult uploadFileResult s3Client.uploadFile(uploadFileRequest); CompleteMultipartUploadResult multipartUploadResult uploadFileResult.getMultipartUploadResult(); System.out.println(multipartUploadResult); } catch (Throwable e) { throw new RuntimeException(e); } } catch (Exception e) { System.err.println("Upload failed: " + e.getMessage()); e.printStackTrace(); } } }