Skip to content

Instantly share code, notes, and snippets.

@harlesbayu
Last active March 30, 2020 13:43
Show Gist options
  • Save harlesbayu/feeb62183c9780ace3c92ee0d74d61d9 to your computer and use it in GitHub Desktop.
Save harlesbayu/feeb62183c9780ace3c92ee0d74d61d9 to your computer and use it in GitHub Desktop.
Function multipart upload
const AWS = require('aws-sdk');
const config = require('../../config');
const spacesEndpoint = new AWS.Endpoint(config.get('SPACE_ENDPOINT'));
const s3bucket = new AWS.S3({
endpoint: spacesEndpoint,
accessKeyId: config.get('ACCESS_KEY_ID'),
secretAccessKey: config.get('SECRET_ACCESS_KEY')
});
// untuk parameter bisa di sesuaikan
const uploadMultipartVideo = ({
originalname,
buffer,
type,
fileType,
topicType,
videoId,
timestamp
}) => {
const bucket = ''; // masukan nama bucket
// Upload
var startTime = new Date();
let partNum = 0;
var partSize = 1024 * 1024 * 5;
var numPartsLeft = Math.ceil(buffer.length / partSize);
var maxUploadTries = 3;
var multipartMap = {
Parts: []
};
const fileKey = `${config.get('BUCKET_KEY')}/${type}/${fileType}/${timestamp}-${originalname}`; // sesuai kebutuhan
const multiPartParams = {
Bucket: bucket,
Key: fileKey,
ACL: 'public-read'
};
function completeMultipartUpload(doneParams) {
s3bucket.completeMultipartUpload(doneParams, (err, data) => {
if (err) {
console.log('An error occurred while completing the multipart upload');
console.log(err);
} else {
const delta = (new Date() - startTime) / 1000;
/*
disini merupakan output ketika upload berhasil
bebas bisa dimasukan apa saja, sesuaikan dengan kebutuhan
*/
console.log('Completed upload in', delta, 'seconds');
console.log('Final upload data:', data);
}
});
}
function uploadPart(multipart, partParams, tryNum) {
var tryNum = tryNum || 1;
s3bucket.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(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);
// eslint-disable-next-line no-plusplus
if (--numPartsLeft > 0) return; // complete only when all parts uploaded
const doneParams = {
Bucket: bucket,
Key: fileKey,
MultipartUpload: multipartMap,
UploadId: multipart.UploadId
};
console.log('Completing upload...');
completeMultipartUpload(doneParams);
});
}
// Multipart
console.log('Creating multipart upload for:', fileKey);
s3bucket.createMultipartUpload(multiPartParams, (mpErr, multipart) => {
if (mpErr) { console.log('Error!', mpErr); return; }
console.log('Got upload ID', multipart.UploadId);
/*
contoh size data yang akan di upload
58065945 buffer on byte
5242880 partSize
*/
// Grab each partSize chunk and upload it as a part
for (let rangeStart = 0; rangeStart < buffer.length; rangeStart += partSize) {
// eslint-disable-next-line no-plusplus
partNum++;
const end = Math.min(rangeStart + partSize, buffer.length);
const partParams = {
Body: buffer.slice(rangeStart, end),
Bucket: bucket,
Key: fileKey,
PartNumber: String(partNum),
UploadId: multipart.UploadId
};
// Send a single part
console.log('Uploading part: #', partParams.PartNumber, ', Range start:', rangeStart);
uploadPart(multipart, partParams);
}
});
};
module.exports = {
uploadMultipartVideo
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment