融合接口
分片上传步骤较多,包括初始化、文件切片、各个分片上传、完成上传。为了简化分片上传,Java SDK 提供了分片上传的封装接口。您可以调用 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用于标识文件的资源类型,比如image/png
, image/jpg
是图片类型,video/mpeg
, video/mp4
是视频类型,text/plain
, text/html
是文本类型, 浏览器针对不同的Content-Type会有不同的操作,比如图片类型可以预览,视频类型可以播放,文本类型可以直接打开。application/octet-stream
类型会直接打开下载窗口。
在java sdk中,如果用户没有设置Content-Type,会根据PutObjectRequest中file参数的后缀扩展名自动生成Content-Type。