<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>鑷畾涔夌殑鍒嗙墖涓婁紶</title>
    <style>
        h1, h2 {
            font-weight: normal;
        }

        #msg {
            margin-top: 10px;
        }
    </style>
</head>
<body>

<h1>鑷畾涔夌殑鍒嗙墖涓婁紶</h1>

<input id="fileSelector" type="file">
<input id="submitBtn" type="submit">

<div id="msg"></div>

<script src="../dist/cos-js-sdk-v5.js"></script>
<script src="./common/async.js"></script>
<script>
    (function () {
        // 璇锋眰鐢ㄥ埌鐨勫弬鏁�
        var Bucket = 'test-1250000000';
        var Region = 'ap-guangzhou';
        var ChunkSize = 1024 * 1024 * 8;

        // 鍒濆鍖� SDK
        var cos = new COS({
            getAuthorization: function (options, callback) {
                var url = '/sts'; // 濡傛灉鏄� npm run sts.js 璧风殑 nodejs server锛屼娇鐢ㄨ繖涓�
                var xhr = new XMLHttpRequest();
                xhr.open('GET', url, true);
                xhr.onload = function (e) {
                    try {
                        var data = JSON.parse(e.target.responseText);
                        var credentials = data.credentials;
                    } catch (e) {
                    }
                    if (!data || !credentials) return console.error('credentials invalid');
                    callback({
                        TmpSecretId: credentials.tmpSecretId,
                        TmpSecretKey: credentials.tmpSecretKey,
                        SecurityToken: credentials.sessionToken,
                        StartTime: data.startTime, // 鏃堕棿鎴筹紝鍗曚綅绉掞紝濡傦細1580000000锛屽缓璁繑鍥炴湇鍔″櫒鏃堕棿浣滀负绛惧悕鐨勫紑濮嬫椂闂达紝閬垮厤鐢ㄦ埛娴忚鍣ㄦ湰鍦版椂闂村亸宸繃澶у鑷寸鍚嶉敊璇�
                        ExpiredTime: data.expiredTime, // 鏃堕棿鎴筹紝鍗曚綅绉掞紝濡傦細1580000900
                    });
                };
                xhr.send();
            },
        });

        // 涓婁紶鏂囦欢
        var uploadFile = function (file, callback) {
            var fileSize = file.size;
            var Key = 'dir/' + file.name; // 杩欓噷鎸囧畾涓婁紶鐩綍鍜屾枃浠跺悕
            // 鍒涘缓 UploadId
            cos.multipartInit({
                Bucket: Bucket,
                Region: Region,
                Key: Key,
            }, function (err, data) {
                if (err) return console.error('UploadId 鍒涘缓鍑洪敊锛�', err);
                var UploadId = data.UploadId;
                console.log('UploadId 宸插垱寤猴細', UploadId);
                var Parts = new Array(Math.ceil(fileSize / ChunkSize)).fill(0).map(function (item, index) {
                    return {PartNumber: index + 1};
                });
                Async.eachLimit(Parts, 3, function (partItem, nextPart) {
                    var PartNumber = partItem.PartNumber;
                    var start = (PartNumber - 1) * ChunkSize;
                    var end = Math.min(start + ChunkSize);
                    var blob = file.slice(start, end);
                    // 涓婁紶姣忎釜鍒嗙墖
                    cos.multipartUpload({
                        Bucket: Bucket,
                        Region: Region,
                        Key: Key,
                        UploadId: UploadId,
                        PartNumber: PartNumber,
                        Body: blob,
                    }, function (err, data) {
                        if (err) return nextPart(err);
                        if (!data.headers.etag) return nextPart('娴忚鍣ㄨ幏鍙栦笉鍒� ETag Header锛岄渶瑕佸瓨鍌ㄦ《閰嶇疆 CORS ExposeHeaders 鍏佽褰撳墠鍩熷悕璺ㄥ煙璇诲彇 ETag 瀛楁銆�');
                        partItem.ETag = data.headers.etag || '';
                        console.log('鍒嗙墖涓婁紶瀹屾垚锛�', partItem.PartNumber, partItem.ETag);
                        nextPart();
                    });
                }, function (err) {
                    if (err) return console.error('涓婁紶鍒嗙墖鍑洪敊锛�', err);
                    // 瀹屾垚鍒嗙墖涓婁紶
                    cos.multipartComplete({
                        Bucket: Bucket,
                        Region: Region,
                        Key: Key,
                        UploadId: UploadId,
                        Parts: Parts,
                    }, function (err, data) {
                        if (err) return console.error('鏂囦欢瀹屾垚鍑洪敊锛�', err);
                        console.log('鏂囦欢涓婁紶鎴愬姛锛�', data.Location);
                        callback(err, data);
                    });
                });
            });
        };

        // 鐩戝惉琛ㄥ崟鎻愪氦
        document.getElementById('submitBtn').onclick = function (e) {
            var file = document.getElementById('fileSelector').files[0];
            if (!file) {
                document.getElementById('msg').innerText = '鏈€夋嫨涓婁紶鏂囦欢';
                return;
            }
            file && uploadFile(file, function (err, data) {
                console.log(err || data);
                document.getElementById('msg').innerText = err ? err : ('涓婁紶鎴愬姛锛孍Tag=' + data.ETag);
            });
        };
    })();
</script>

</body>
</html>