diff --git a/s3-upload.js b/s3-upload.js new file mode 100644 index 0000000..bea7d04 --- /dev/null +++ b/s3-upload.js @@ -0,0 +1,49 @@ +'use strict' +const fs = require('fs') +const path = require('path') + +const config = require('../../config') +const { getImageMimeType } = require('../../utils') +const logger = require('../../logger') + +const AWS = require('aws-sdk') +const awsConfig = new AWS.Config(config.s3) +const s3 = new AWS.S3(awsConfig) + +exports.uploadImage = function (imagePath, callback) { + if (!imagePath || typeof imagePath !== 'string') { + callback(new Error('Image path is missing or wrong'), null) + return + } + + if (!callback || typeof callback !== 'function') { + logger.error('Callback has to be a function') + return + } + + fs.readFile(imagePath, function (err, buffer) { + if (err) { + callback(new Error(err), null) + return + } + const params = { + Bucket: config.s3bucket, + Key: path.join(config.s3folder, path.basename(imagePath)), + Body: buffer + } + + const mimeType = getImageMimeType(imagePath) + if (mimeType) { params.ContentType = mimeType } + if (config.s3publicFiles) { params.ACL = 'public-read' } + + logger.debug(`S3 object parameters: ${JSON.stringify(params)}`) + s3.putObject(params, function (err, data) { + if (err) { + callback(new Error(err), null) + return + } + + callback(null, `https://notes-media.ietf.org/${params.Key}`) + }) + }) +}