UNPKG

mss-sdk

Version:
101 lines (90 loc) 3.19 kB
// Based on Glacier's example: http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/examples.html#Amazon_Glacier__Multi-part_Upload var KEY = require('./key') var MSS = require('../'); //ʵ����,��ǰʵ����Ч: var s3 = new MSS.S3({ accessKeyId: KEY.access_key, secretAccessKey: KEY.secret_key }); // File var bucket_name = KEY.bucket_name; var object_name = 'upload/multipart_bigfile'; var buffer = require('fs').readFileSync('./upload/bigfile'); // Upload var startTime = new Date(); var partNum = 0; var partSize = 1024 * 1024 * 5; // Minimum 5MB per chunk (except the last part) var numPartsLeft = Math.ceil(buffer.length / partSize); var maxUploadTries = 1; var multiPartParams = { Bucket: bucket_name, Key: object_name }; var multipartMap = { Parts: [] }; function completeMultipartUpload(s3, doneParams) { s3.completeMultipartUpload(doneParams, function(err, data) { if (err) { console.log("An error occurred while completing the multipart upload"); console.log(err); } else { var delta = (new Date() - startTime) / 1000; console.log('Completed upload in', delta, 'seconds'); console.log('Final upload data:', data); } }); } function uploadPart(s3, multipart, partParams, tryNum) { var tryNum = tryNum || 1; console.log("partParams: [%j]", partParams.UploadId) s3.uploadPart(partParams, function(multiErr, mData) { if (multiErr){ console.log('multiErr, upload part error:', multiErr); if (tryNum < maxUploadTries) { console.log('Retrying upload of part: #', partParams.PartNumber) uploadPart(s3, multipart, partParams, tryNum + 1); } else { console.log('Failed uploading part: #', partParams.PartNumber) } return; } multipartMap.Parts[this.request.params.PartNumber - 1] = { ETag: mData.ETag, PartNumber: Number(this.request.params.PartNumber) }; console.log("Completed part", this.request.params.PartNumber); console.log('mData', mData); if (--numPartsLeft > 0) return; // complete only when all parts uploaded var doneParams = { Bucket: bucket_name, Key: object_name, MultipartUpload: multipartMap, UploadId: multipart.UploadId }; console.log("Completing upload..."); completeMultipartUpload(s3, doneParams); }); } // Multipart console.log("Creating multipart upload for:", object_name); s3.createMultipartUpload(multiPartParams, function(mpErr, multipart){ if (mpErr) { console.log('Error!', mpErr); return; } console.log("Got upload ID", multipart.UploadId); // Grab each partSize chunk and upload it as a part for (var rangeStart = 0; rangeStart < buffer.length; rangeStart += partSize) { partNum++; var end = Math.min(rangeStart + partSize, buffer.length), partParams = { Body: buffer.slice(rangeStart, end), Bucket: bucket_name, Key: object_name, PartNumber: String(partNum), UploadId: multipart.UploadId }; // Send a single part console.log('Uploading part: #', partParams.PartNumber, ', Range start:', rangeStart); console.log("multipart: [%j]", multipart) uploadPart(s3, multipart, partParams); } });