|
@@ -1,6 +1,6 @@
|
|
|
let bucket; //aws上传接口
|
|
|
let bucketname = "ccrb"; //桶
|
|
|
-const partsize = 1 * 1024 * 1024; // 1MB
|
|
|
+const partsize = 5 * 1024 * 1024; // 5MB
|
|
|
|
|
|
//--------------------------分断上传保证稳定性
|
|
|
//初始化上传
|
|
@@ -21,10 +21,12 @@ async function init() {
|
|
|
}
|
|
|
|
|
|
//初始化上传入口
|
|
|
-async function initMultipartUpload(file, folderid) {
|
|
|
+async function initMultipartUpload(key, file) {
|
|
|
const params = {
|
|
|
Bucket: bucketname,
|
|
|
- Key: folderid + "/" + file.name
|
|
|
+ Key: key,
|
|
|
+ ContentType: file.type,
|
|
|
+ "ACL": "public-read"
|
|
|
};
|
|
|
//创建一个续传通道
|
|
|
const data = await bucket.createMultipartUpload(params).promise();
|
|
@@ -37,31 +39,23 @@ async function uploadPart(file, keyname, uploadid, pn, start, end) {
|
|
|
var params = {
|
|
|
Bucket: bucketname,
|
|
|
Key: keyname,
|
|
|
- ContentType: file.type,
|
|
|
PartNumber: pn,
|
|
|
UploadId: uploadid,
|
|
|
- Body: file.slice(start, end),
|
|
|
- "Access-Control-Allow-Credentials": "*",
|
|
|
- ACL: "public-read",
|
|
|
+ Body: file.slice(start, end)
|
|
|
};
|
|
|
- const result = await bucket.uploadPart(params).promise()
|
|
|
- .then((data) => {
|
|
|
- return { ETag: result.ETag, PartNumber: pn };
|
|
|
- })
|
|
|
- .catch((err) => {
|
|
|
- return err;
|
|
|
- });
|
|
|
+ const result = await bucket.uploadPart(params).promise();
|
|
|
+ return { ETag: result.ETag, PartNumber: pn };
|
|
|
}
|
|
|
|
|
|
// 完成分块上传
|
|
|
-async function completeMultipartUpload(parts, keyname) {
|
|
|
+async function completeMultipartUpload(parts, keyname, uploadid) {
|
|
|
const params = {
|
|
|
Bucket: bucketname,
|
|
|
Key: keyname,
|
|
|
MultipartUpload: { Parts: parts },
|
|
|
UploadId: uploadid
|
|
|
};
|
|
|
- await bucket.completeMultipartUpload(params).promise();
|
|
|
+ return await bucket.completeMultipartUpload(params).promise();
|
|
|
}
|
|
|
|
|
|
//中止分块上传
|
|
@@ -82,7 +76,7 @@ async function uploadFile(file, folderid) {
|
|
|
try {
|
|
|
init(); // 初始化aws接口
|
|
|
// 初始化分块上传
|
|
|
- uploadid = await initMultipartUpload(file, folderid);
|
|
|
+ uploadid = await initMultipartUpload(keyname, file);
|
|
|
// 分块上传文件
|
|
|
let parts = [];
|
|
|
let start = 0;
|
|
@@ -95,7 +89,7 @@ async function uploadFile(file, folderid) {
|
|
|
parts.push(await uploadPart(file, keyname, uploadid, i, start, end));
|
|
|
}
|
|
|
// 完成分块上传
|
|
|
- await completeMultipartUpload(parts, uploadid);
|
|
|
+ await completeMultipartUpload(parts, keyname, uploadid);
|
|
|
return uploadid;
|
|
|
}
|
|
|
catch (error) {
|
|
@@ -151,24 +145,23 @@ async function awsuploadpart(filestate, file, uploadid, parts, key) {
|
|
|
return { PartNumber: _.PartNumber, ETag: _.ETag };
|
|
|
});
|
|
|
// 分块上传文件
|
|
|
- let parts = [];
|
|
|
let uploadpart;
|
|
|
let start = 0;
|
|
|
let end = 0;
|
|
|
- let len = Math.ceil(file.length / partsize); //循环的长度
|
|
|
+ let len = Math.ceil(file.size / partsize); //循环的长度
|
|
|
if (partarr.length) {
|
|
|
filestate.status = "processing";
|
|
|
- filestate.percent = parseInt((completeparts.length * 100) / count);
|
|
|
+ filestate.percent = parseInt((completeparts.length * 100) / len);
|
|
|
}
|
|
|
//循环上传
|
|
|
for (let i = 0; i < len; i++) {
|
|
|
start = i * partsize;
|
|
|
end = (i + 1) * partsize;
|
|
|
if (!partarr.includes(i)) {
|
|
|
- uploadpart = await uploadPart(file, key, uploadid, i, start, end);
|
|
|
+ uploadpart = await uploadPart(file, key, uploadid, i + 1, start, end);
|
|
|
if (uploadpart.ETag != null) {
|
|
|
completeparts.push(uploadpart);
|
|
|
- filestate.percent = parseInt((completeparts.length * 100) / count);
|
|
|
+ filestate.percent = parseInt((completeparts.length * 100) / len);
|
|
|
}
|
|
|
|
|
|
else {
|
|
@@ -178,7 +171,9 @@ async function awsuploadpart(filestate, file, uploadid, parts, key) {
|
|
|
}
|
|
|
}
|
|
|
//提交上传成功信息
|
|
|
- await completeMultipartUpload(completeparts, uploadid);
|
|
|
+ var data = await completeMultipartUpload(completeparts, key, uploadid);
|
|
|
+ filestate.status = "success";
|
|
|
+ return data;
|
|
|
}
|
|
|
|
|
|
//上传的接口
|
|
@@ -203,12 +198,14 @@ async function awsupload(file, folderid, filestate) {
|
|
|
//如果已经部分存在,那么直接在节点续传
|
|
|
if (uploadid) {
|
|
|
//断点续传
|
|
|
- awsuploadpart(filestate, file, uploadid, partsinfo.Parts, key);
|
|
|
+ var data = await awsuploadpart(filestate, file, uploadid, partsinfo.Parts, key);
|
|
|
+ return { data, key, uploadid };
|
|
|
}
|
|
|
//不存在,上传新的
|
|
|
else {
|
|
|
- const uploadid = await initMultiPartUpload(bucket, params); //初始化文件上传
|
|
|
- awsuploadpart(filestate, file, uploadid, [], key);
|
|
|
+ const uploadid = await initMultipartUpload(key, file); //初始化文件上传
|
|
|
+ var data = await awsuploadpart(filestate, file, uploadid, [], key);
|
|
|
+ return { data, key, uploadid };
|
|
|
}
|
|
|
}
|
|
|
//如果已经上传成功了,那么直接返回状态百分百
|
|
@@ -216,6 +213,7 @@ async function awsupload(file, folderid, filestate) {
|
|
|
//data存在,上传成功
|
|
|
filestate.percent = 100;
|
|
|
filestate.status = "success";
|
|
|
+ return { data, key };
|
|
|
}
|
|
|
});
|
|
|
}
|
|
@@ -223,6 +221,4 @@ async function awsupload(file, folderid, filestate) {
|
|
|
filestate.status = "error";
|
|
|
console.log(err);
|
|
|
}
|
|
|
- return filestate;
|
|
|
-}
|
|
|
-
|
|
|
+}
|