Skip to content

Commit 02a391b

Browse files
committed
加分片上传 demo
1 parent fa91234 commit 02a391b

File tree

2 files changed

+166
-0
lines changed

2 files changed

+166
-0
lines changed

demo/common/async.js

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
var eachLimit = function (arr, limit, iterator, callback) {
2+
callback = callback || function () {};
3+
if (!arr.length || limit <= 0) {
4+
return callback();
5+
}
6+
7+
var completed = 0;
8+
var started = 0;
9+
var running = 0;
10+
11+
(function replenish () {
12+
if (completed >= arr.length) {
13+
return callback();
14+
}
15+
16+
while (running < limit && started < arr.length) {
17+
started += 1;
18+
running += 1;
19+
iterator(arr[started - 1], function (err) {
20+
21+
if (err) {
22+
callback(err);
23+
callback = function () {};
24+
} else {
25+
completed += 1;
26+
running -= 1;
27+
if (completed >= arr.length) {
28+
callback();
29+
} else {
30+
replenish();
31+
}
32+
}
33+
});
34+
}
35+
})();
36+
};
37+
38+
var Async = {
39+
eachLimit: eachLimit,
40+
};

demo/slice.html

+126
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>自定义的分片上传</title>
6+
<style>
7+
h1, h2 {
8+
font-weight: normal;
9+
}
10+
11+
#msg {
12+
margin-top: 10px;
13+
}
14+
</style>
15+
</head>
16+
<body>
17+
18+
<h1>自定义的分片上传</h1>
19+
20+
<input id="fileSelector" type="file">
21+
<input id="submitBtn" type="submit">
22+
23+
<div id="msg"></div>
24+
25+
<script src="../dist/cos-js-sdk-v5.js"></script>
26+
<script src="./common/async.js"></script>
27+
<script>
28+
(function () {
29+
// 请求用到的参数
30+
var Bucket = 'test-1250000000';
31+
var Region = 'ap-guangzhou';
32+
var ChunkSize = 1024 * 1024 * 8;
33+
34+
// 初始化 SDK
35+
var cos = new COS({
36+
getAuthorization: function (options, callback) {
37+
var url = '/sts'; // 如果是 npm run sts.js 起的 nodejs server,使用这个
38+
var xhr = new XMLHttpRequest();
39+
xhr.open('GET', url, true);
40+
xhr.onload = function (e) {
41+
try {
42+
var data = JSON.parse(e.target.responseText);
43+
var credentials = data.credentials;
44+
} catch (e) {
45+
}
46+
if (!data || !credentials) return console.error('credentials invalid');
47+
callback({
48+
TmpSecretId: credentials.tmpSecretId,
49+
TmpSecretKey: credentials.tmpSecretKey,
50+
XCosSecurityToken: credentials.sessionToken,
51+
StartTime: data.startTime, // 时间戳,单位秒,如:1580000000,建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
52+
ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000900
53+
});
54+
};
55+
xhr.send();
56+
},
57+
});
58+
59+
// 上传文件
60+
var uploadFile = function (file, callback) {
61+
var fileSize = file.size;
62+
var Key = 'dir/' + file.name; // 这里指定上传目录和文件名
63+
cos.multipartInit({
64+
Bucket: Bucket,
65+
Region: Region,
66+
Key: Key,
67+
}, function (err, data) {
68+
if (err) return console.error('UploadId 创建出错:', err);
69+
var UploadId = data.UploadId;
70+
console.log('UploadId 已创建:', UploadId);
71+
var Parts = new Array(Math.ceil(fileSize / ChunkSize)).fill(0).map(function (item, index) {
72+
return {PartNumber: index + 1};
73+
});
74+
Async.eachLimit(Parts, 3, function (partItem, nextPart) {
75+
var PartNumber = partItem.PartNumber;
76+
var start = (PartNumber - 1) * ChunkSize;
77+
var end = Math.min(start + ChunkSize);
78+
var blob = file.slice(start, end);
79+
cos.multipartUpload({
80+
Bucket: Bucket,
81+
Region: Region,
82+
Key: Key,
83+
UploadId: UploadId,
84+
PartNumber: PartNumber,
85+
Body: blob,
86+
}, function (err, data) {
87+
if (err) return nextPart(err);
88+
if (!data.headers.etag) return nextPart('浏览器获取不到 ETag Header,需要存储桶配置 CORS ExposeHeaders 允许当前域名跨域读取 ETag 字段。');
89+
partItem.ETag = data.headers.etag || '';
90+
console.log('分片上传完成:', partItem.PartNumber, partItem.ETag);
91+
nextPart();
92+
});
93+
}, function (err) {
94+
if (err) return console.error('上传分片出错:', err);
95+
cos.multipartComplete({
96+
Bucket: Bucket,
97+
Region: Region,
98+
Key: Key,
99+
UploadId: UploadId,
100+
Parts: Parts,
101+
}, function (err, data) {
102+
if (err) return console.error('文件完成出错:', err);
103+
console.log('文件上传成功:', data.Location);
104+
callback(err, data);
105+
});
106+
});
107+
});
108+
};
109+
110+
// 监听表单提交
111+
document.getElementById('submitBtn').onclick = function (e) {
112+
var file = document.getElementById('fileSelector').files[0];
113+
if (!file) {
114+
document.getElementById('msg').innerText = '未选择上传文件';
115+
return;
116+
}
117+
file && uploadFile(file, function (err, data) {
118+
console.log(err || data);
119+
document.getElementById('msg').innerText = err ? err : ('上传成功,ETag=' + data.ETag);
120+
});
121+
};
122+
})();
123+
</script>
124+
125+
</body>
126+
</html>

0 commit comments

Comments
 (0)