融合接口
功能说明
分片上传步骤较多,包括初始化、文件切片、各个分片上传、完成上传。为了简化分片上传,可以使用AWS.S3.ManagedUpload接口进行分片上传。
代码示例
let key = "ExampleObject.txt"
let localFile = "E:/ExampleObject.txt"
let f = fs.createReadStream(localFile)
let upload = new AWS.S3.ManagedUpload({
service: this.s3Client,
partSize: 10 * 1024 * 1024, // 10M一片,可以根据需要自己定义,每个文件不能超过10000分片
params: {
Bucket: this.bucket,
Key: key,
Body: f,
ACL: "private", // 初始化acl权限,默认为private,"private"|"public-read"|"public-read-write"
ContentType: "text/plain", // 设置contentType, 默认是application/octet-stream
},
});
upload.on("httpUploadProgress", progress => console.log(progress))
upload.send((err, data) => {
if (err) {
console.log("Error", err);
} else {
console.log("Success", data);
}
});
关于Content-Type的配置
Content-Type用于标识文件的资源类型,比如image/png
, image/jpg
是图片类型,video/mpeg
, video/mp4
是视频类型,text/plain
, text/html
是文本类型, 浏览器针对不同的Content-Type会有不同的操作,比如图片类型可以预览,视频类型可以播放,文本类型可以直接打开。application/octet-stream
类型会直接打开下载窗口。
有些用户反馈图片和视频无法预览的问题,主要就是Content-Type没有正确设置导致的;Content-Type参数需要用户主动设置,默认是application/octet-stream
。在nodejs中,可以根据对象key值后缀扩展名来决定文件的Content-Type,参考代码如下:
let mime = require("mime-types")
let mimeType = (key) => {
let ret = mime.lookup(key);
if (ret == false) {
return "";
}
return ret;
}
请求参数
参数 | 类型 | 说明 | 是否必要 |
---|
Bucket | String | 桶名称 | 是 |
Key | String | 对象名称 | 是 |
Body | String | 对象内容 | 是 |
ACL | String | 对象访问控制权限 | 否 |
ContentType | String | 对象类型 | 是 |
partSize | Long | 对象分片大小 | 是 |
返回结果
参数 | 类型 | 说明 |
---|
Etag | String | 本次上传对象对应的Entity Tag |
Location | String | 对象的URL信息 |
Key | String | 对象名称 |
Bucket | String | 桶名称 |
初始化分片上传任务
功能说明
使用createMultipartUpload接口创建分片上传任务,该接口会返回一个UploadId,客户端使用这个UploadId来上传分片。
代码示例
var createParams = {
Bucket: "<your-bucket-name>",
Key: "<your-key-name>"
};
s3Client.createMultipartUpload(createParams, function (err, data) {
if (err)
console.log(err, err.stack);
else
console.log(data);
});
请求参数
参数 | 类型 | 说明 | 是否必要 |
---|
Bucket | String | 桶名称 | 是 |
Key | String | 对象名称 | 是 |
返回结果
参数 | 类型 | 说明 |
---|
Bucket | String | 执行分片上传的桶的名称。 |
Key | String | 本次分片上传对象的名称。 |
UploadId | String | 本次生成分片上传任务的id。 |
上传分片
功能说明
初始化分片上传任务后,可以根据指定的对象名和Upload ID来分片上传数据。将大文件分割成分片后上传,除了最后一个分片,每个分片的数据大小为5MB~5GB,每个分片上传任务最多上传10000个分片。每一个上传的对象分片都对应一个分片号。对于同一个Upload ID,该分片号不但唯一标识这一段数据,也标识了分片数据在整个对象内的相对位置。
代码示例
var partParams = {
Bucket: "<your-bucket-name>",
Key: "<your-key-name>",
// 设置分片号,范围是1~10000
PartNumber: "<your-part-name>",
// 设置Upload ID
UploadId: "<your-upload-id>",
// 设置将要上传的大文件
Body: document.getElementById('input-file').files[0],
}
s3Client.uploadPart(partParams, function (err, result) {
if(err){
console.log('uploadPart Error ' + err);
}else{
console.log('uploadPart ETag ' + result.ETag);
}
});
请求参数
参数 | 类型 | 说明 | 是否必要 |
---|
Bucket | String | 桶名称 | 是 |
Body | String | 对象数据流 | 是 |
Key | String | 对象名称 | 是 |
UploadId | String | 分片上传id | 是 |
PartNumber | Long | 分片个数 | 是 |
返回结果
参数 | 类型 | 说明 |
---|
Etag | String | 本次上传分片对应的Entity Tag |
合并分片
功能说明
使用completeMultipartUpload完成分片上传任务。合并指定分片上传任务id对应任务中已上传的对象分片,使之成为一个完整的文件对象。
代码示例
var params = {
Bucket: "<your-bucket-name>",
Key: "<your-key-name>",
// 设置Upload ID
UploadId: "<your-upload-id>",
MultipartUpload: {
Parts: [
{
ETag: "<your-object-etag>",
PartNumber: "<your-part-number>"
},
{
ETag: "<your-object-etag>",
PartNumber: "<your-part-number>"
},
{
ETag: "<your-object-etag>",
PartNumber: "<your-part-number>"
},
...
]
},
};
s3Client.completeMultipartUpload(params, function (err, data) {
if (err) {
console.log('completeMultipartUpload err, ', err);
} else {
console.log('completeMultipartUpload success');
}
});
请求参数
参数 | 类型 | 说明 | 是否必要 |
---|
Bucket | String | 桶名称 | 是 |
Key | String | 对象名称 | 是 |
UploadId | String | 对象分片id | 是 |
MultipartUpload | String | 对象分片列表,包含了每个已上传的分片的ETag和PartNumber等信息 | 是 |
返回结果
参数 | 类型 | 说明 |
---|
ETag | string | 本次上传对象后对应的Entity Tag |
Bucket | String | 执行分片上传的桶的名称 |
Key | String | 上传文件到对象存储服务后对应的key |
Location | String | 合并生成对象的URL信息 |
列举分片上传任务
功能说明
列举分片上传操作可以列出一个桶中正在进行的分片上传,这些分片上传的请求已经发起,但是还没完成或者被中止。listMultipartUploads 操作可以通过指定maxUploads参数来设置返回分片上传信息的数量,maxUploads参数的最大值和默认值均为1000。如果返回结果中的isTruncated字段为true,表示还有符合条件的分片上传信息没有列出,可以通过设置请求中的keyMarker和uploadIdMarker参数,来列出符合筛选条件的正在上传的分片信息。
代码示例
var params = {
Bucket: "<your-bucket-name>"
};
s3Client.listMultipartUploads(params, function (err, data) {
if (err) {
console.log('listMultipartUploads err, ', err);
} else {
console.log('listMultipartUploads success, ', data);
}
});
请求参数
参数 | 类型 | 说明 | 是否必要 |
---|
Bucket | String | 桶名称 | 是 |
返回结果
参数 | 类型 | 说明 |
---|
Bucket | String | 执行本操作的桶名称 |
CommonPrefixes | Array | 当请求中设置了Delimiter和Prefix属性时,所有包含指定的Prefix且第一次出现Delimiter字符的对象key作为一组 |
IsTruncated | Bool | 当为false时表示返回结果中包含了全部符合本次请求查询条件的分片上传任命信息,否则只返回了数量为MaxUploads个的分片信息 |
MaxUploads | Int | 本次返回结果中包含的分片上传任务数量的最大值 |
KeyMarker | String | 返回分片上传任务列表中的起始对象的key |
NextKeyMarker | String | 当IsTruncated为true时,NextKeyMarker可以作为后续查询已初始化的分片上传任务请求中的KeyMarker的值 |
UploadIdMarker | String | 返回分片上传任务列表中的起始UploadId。 |
NextUploadIdMarker | String | 当IsTruncated为true时,NextKeyMarker可以作为后续查询已初始化的分片上传任务请求中的UploadIdMarker的值 |
Uploads | Array | 包含了零个或多个已初始化的分片上传任务信息的数组。数组中的每一项包含了分片初始化时间、分片上传操作发起者、对象key、对象拥有者、存储类型和UploadId等信息 |
列举已上传的分片
功能说明
使用listParts可以根据UploadId列举已完成上传的分片。可以使用此接口实现断点续传,在客户端保存UploadId和对应的本地文件路径,重新上传的时候先通过listParts获取到已上传的分片,避免重复上传这些分片,从而实现断点续传。
代码示例
var params = {
Bucket: "<your-bucket-name>",
Key: "<your-key-name>",
// 设置Upload ID
UploadId: "<your-upload-id>"
};
s3Client.listParts(params, function (err, data) {
if (err) {
console.log('listParts err, ', err);
} else {
console.log('listParts success, ', data);
}
});
请求参数
参数 | 类型 | 说明 | 是否必要 |
---|
Bucket | String | 桶名称 | 是 |
Key | String | 对象名称 | 是 |
UploadId | String | 分片任务id | 是 |
返回结果
参数 | 类型 | 说明 |
---|
Bucket | String | 执行本操作的桶名称 |
Key | String | 执行本操作的对象名称 |
UploadId | String | 分片任务id |
IsTruncated | Bool | 当为false时表示返回结果中包含了全部符合本次请求查询条件的上传分片信息,否则只返回了数量为MaxParts个的分片信息 |
PartNumberMarker | Int | 返回分片上传任务分片号 |
NextPartNumberMarker | Int | 当IsTruncated为true时,NextPartNumberMarker可以作为后续查询已上传分片请求中的PartNumberMarker的值 |
MaxParts | Int | 本次返回结果中包含的上传分片数量的最大值 |
Owner | Object | 分片上传对象的拥有者信息,包含了用户名和Id等信息 |
Parts | Array | 包含了已上传分片信息的数组,数组中的每一项包含了该分片的Entity tag、最后修改时间、PartNumber和大小等信息 |
StorageClass | String | 对象的存储类型 |
复制分片
功能说明
复制分片操作可以从一个已存在的对象中复制指定分片的数据。您可以使用 uploadPartCopy 复制分片。在复制分片前,需要使用 initiateMultipartUpload 接口获取一个upload id,在完成复制和上传分片操作之后,需要使用 completeMultipartUpload 操作组装分片成为一个对象。当复制的对象大小超过5GB,必须使用复制分片操作完成对象的复制。除了最后一个分片外,每个复制分片的大小范围是[5MB,5GB]。
代码示例
var params = {
Bucket: "<dst-bucket-name>",
Key: "<dst-bucket-name>",
// 设置Upload ID
UploadId: "<your-upload-id>",
// 设置分片号,范围是1~10000
PartNumber: "<your-part-name>",
CopySource: "<source-bucket-name>" + "/" + "<source-object-key>" // 必须加上桶名前缀,
};
s3Client.uploadPartCopy(params, function (err, data) {
if (err) {
console.log("Error", err);
} else {
console.log("Success", data);
}
});
请求参数
参数 | 类型 | 说明 | 是否必要 |
---|
Bucket | String | 目的桶名称 | 是 |
Key | String | 目的对象key | 是 |
CopySource | string | 源对象地址(bucket+key) | 是 |
UploadId | String | 与本次复制操作相应的分片上传任务Id | 是 |
PartNumber | String | 与本次复制操作相应的分片编号 | 是 |
返回结果
参数 | 类型 | 说明 |
---|
CopyPartResult | CopyPartResult | 包含拷贝分片的Entity Tag和最后修改时间等信息 |
取消分片上传任务
功能说明
使用abortMultipartUpload取消分片上传任务。
代码示例
var params = {
Bucket: "<your-bucket-name>",
Key: "<your-key-name>",
// 设置Upload ID
UploadId: "<your-upload-id>",
};
s3Client.abortMultipartUpload(params, function (err, data) {
if (err) {
console.log('abortMultipartUpload err, ', err);
} else {
console.log('abortMultipartUpload success');
}
});
请求参数
参数 | 类型 | 说明 | 是否必要 |
---|
Bucket | String | 桶名称 | 是 |
Key | String | 对象名称 | 是 |
UploadId | String | 上传分片id | 是 |
返回结果
根据返回码判断是否操作成功。