Skip to content

Instantly share code, notes, and snippets.

@ranafarhanakram
Created March 1, 2018 16:11
Show Gist options
  • Save ranafarhanakram/ee238c964329059351bfa0d80660cb3d to your computer and use it in GitHub Desktop.
Save ranafarhanakram/ee238c964329059351bfa0d80660cb3d to your computer and use it in GitHub Desktop.
function newReadAndUpload(){
// Compute hash
var filename = path.join(__dirname, '/input.csv.gz');
return hash(filename).then(hash=>{
console.log("hash: " + hash);
// Generated signed url
return getSignedUrl(hash).then(signedURL=>{
console.log("Signed URL: " + signedURL);
// Open file
var stat = fs2.stat(filename);
var stream = fs2.createReadStream(filename);
console.log(stat);
// Upload
var urlOpts = url.parse(signedURL);
var req = https.request({
method: 'PUT',
host: urlOpts.host,
path: urlOpts.path,
headers: {
'content-type': 'application/x-tar',
//'content-length': stat.size,
'content-encoding': 'gzip',
'cache-control': 'public, no-transform',
'content-md5': hash
}
});
// Pipe stream
stream.pipe(req);
return res().then(res =>{
// Print status code
console.log("Response Code: " + res.statusCode);
// Discard response text
res.resume();
}).catch(err =>{
return {status: false, code: 500, data: err};
});
}).catch(err =>{
return {status: false, code: 500, data: err};
});
}).catch(err =>{
return {status: false, code: 500, data: err};
})
}
function hash(filename){
var hash = new Promise((accept, reject) => {
var md5 = crypto.createHash('md5');
var stream = fs2.createReadStream(filename);
stream.on('data', d => md5.update(d));
stream.on('end', () => accept(md5.digest('base64')));
stream.on('error', reject);
});
return hash;
}
function res(){
var res = new Promise((accept, reject) => {
req.on('response', accept);
req.on('error', reject);
req.setTimeout(5 * 60 * 1000, reject);
});
return res;
}
function getSignedUrl(hash){
var signedURL = new Promise((accept, reject) => {
var s3 = new aws.S3();
s3.getSignedUrl('putObject', {
Bucket: 'itgdata',
Key: 'datadump/" + title + ".gz',
ContentType: 'application/x-tar',
Expires: 15 * 60, // URL expiration
ContentMD5: hash,
Metadata: {
"content-sha256": "Hello World2"
}
}, (err, url) => err ? reject(err) : accept(url));
});
return signedURL ;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment