From 518a4a120b1fe30953b6b526da1eff826484aee0 Mon Sep 17 00:00:00 2001 From: Yukai Huang Date: Wed, 16 Nov 2016 12:05:24 +0800 Subject: [PATCH] upload image to s3 --- app.js | 36 ++++++++++++++++++++++++++++++++---- lib/config.js | 13 ++++++++++++- package.json | 1 + 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/app.js b/app.js index 16ef798e4..7cb33a1d9 100644 --- a/app.js +++ b/app.js @@ -402,13 +402,15 @@ app.get('/me', function (req, res) { }); } }); -//upload to imgur + +//upload image app.post('/uploadimage', function (req, res) { var form = new formidable.IncomingForm(); + form.keepExtensions = true; + if (config.imageUploadType === 'filesystem') { form.uploadDir = "public/uploads"; - form.keepExtensions = true; } form.parse(req, function (err, fields, files) { @@ -418,17 +420,43 @@ app.post('/uploadimage', function (req, res) { if (config.debug) logger.info('SERVER received uploadimage: ' + JSON.stringify(files.image)); + var path = require('path'); try { switch (config.imageUploadType) { case 'filesystem': - var path = require('path'); - res.send({ link: path.join(config.serverurl, files.image.path.match(/^public(.+$)/)[1]) }); break; + case 's3': + var AWS = require('aws-sdk'); + var awsConfig = new AWS.Config(config.s3); + var s3 = new AWS.S3(awsConfig); + + fs.readFile(files.image.path, function (err, buffer) { + var params = { + Bucket: 'hackmd', + Key: path.join('uploads', path.basename(files.image.path)), + Body: buffer + }; + + s3.putObject(params, function (err, data) { + if (err) { + logger.error(err); + res.status(500).end('upload image error'); + } else { + res.send({ + link: `https://s3-${config.s3.region}.amazonaws.com/${config.s3bucket}/${params.Key}` + }); + } + }); + + }); + + break; + case 'imgur': default: imgur.setClientId(config.imgur.clientID); diff --git a/lib/config.js b/lib/config.js index 001cc8fa9..ecc68f755 100644 --- a/lib/config.js +++ b/lib/config.js @@ -59,6 +59,15 @@ var documentmaxlength = config.documentmaxlength || 100000; // image upload setting, available options are imgur/s3/filesystem var imageUploadType = config.imageUploadType || 'imgur'; +var s3Keys = ['accessKeyId', 'secretAccessKey', 'region']; +config.s3 = config.s3 || {}; +var s3 = s3Keys.reduce(function(prev, cur) { + prev[cur] = config.s3[cur]; + return prev; +}, {}); + +var s3bucket = config.s3.bucket; + // auth var facebook = (process.env.HMD_FACEBOOK_CLIENTID && process.env.HMD_FACEBOOK_CLIENTSECRET) ? { clientID: process.env.HMD_FACEBOOK_CLIENTID, @@ -143,5 +152,7 @@ module.exports = { dropbox: dropbox, google: google, imgur: imgur, - imageUploadType: imageUploadType + imageUploadType: imageUploadType, + s3: s3, + s3bucket: s3bucket }; diff --git a/package.json b/package.json index 4ec012f85..7d9acf80c 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "dependencies": { "Idle.Js": "github:shawnmclean/Idle.js", "async": "^2.0.1", + "aws-sdk": "^2.7.0", "blueimp-md5": "^2.4.0", "body-parser": "^1.15.2", "bootstrap": "^3.3.7",