融合接口
功能說明
分片上傳步驟較多,包括初始化、文件切片、各個分片上傳、完成上傳。為了簡化分片上傳,可以使用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 | 是 |
返回結果
根據返回碼判斷是否操作成功。