融合接口

分片上传步骤较多,包括初始化、文件切片、各个分片上传、完成上传。为了简化分片上传,Java SDK 提供了分片上传的封装接口。您可以调用 TransferManager 接口,快速实现文件的分片上传与分片的管理。文件的上传时,TransferManager 会采用多线程的方式,同时进行多个文件的上传。

使用 TransferManager 分片上传

public void upload() {
    try {
        String key = "ExampleObject.txt";
        String localPath = "E:/ExampleObject.txt";

        // TransferManager 只需要初始化一次,可以用于多个上传任务
        TransferManager transMgr = TransferManagerBuilder.standard()
                .withS3Client(s3Client)
                // 设置最小分片大小,默认是5MB。
                .withMinimumUploadPartSize(10*1024*1024L)
                // 设置采用分片上传的阈值为100MB。只有当文件大于该值时,才会采用分片上传,否则采用普通上传。默认值是16MB。
                .withMultipartUploadThreshold(100*1024*1024L)
                .build();

        // TransferManager 采用异步方式进行处理,因此该调用会立即返回。
        PutObjectRequest request = new PutObjectRequest(bucket, key, new File(localPath));
        request.withCannedAcl(CannedAccessControlList.Private);     // 设置对象ACL,可以设置公共读CannedAccessControlList.PublicRead
        ObjectMetadata meta = new ObjectMetadata();
        meta.setContentType("application/octet-stream");            // 设置Content-Type,默认application/octet-stream
        request.setMetadata(meta);                                  // 还可以设置其他自定义元数据

        Upload upload = transMgr.upload(request);
        // 等待上传全部完成。
        UploadResult result = upload.waitForUploadResult();
        System.out.println("upload success, etag=" + result.getETag());
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

取消分片上传

您可以使用 TransferManager.abortMultipartUploads 来取消分片上传。

String bucketName = "<your-bucket-name>";
int sevenDays = 1000 * 60 * 60 * 24 * 7;
Date oneWeekAgo = new Date(System.currentTimeMillis() - sevenDays);
try {
    //取消在一个星期前初始化并还未完成的分片上传
    transMgr.abortMultipartUploads(bucketName, oneWeekAgo);
} catch (AmazonClientException amazonClientException) {
    amazonClientException.printStackTrace();
}

关于Content-Type的配置

Content-Type用于标识文件的资源类型,比如image/pngimage/jpg 是图片类型,video/mpegvideo/mp4是视频类型,text/plaintext/html是文本类型, 浏览器针对不同的Content-Type会有不同的操作,比如图片类型可以预览,视频类型可以播放,文本类型可以直接打开。application/octet-stream类型会直接打开下载窗口。

在java sdk中,如果用户没有设置Content-Type,会根据PutObjectRequest中file参数的后缀扩展名自动生成Content-Type。