diff options
Diffstat (limited to 'lib/web')
| -rw-r--r-- | lib/web/imageRouter.js | 132 | ||||
| -rw-r--r-- | lib/web/imageRouter/filesystem.js | 18 | ||||
| -rw-r--r-- | lib/web/imageRouter/imgur.js | 28 | ||||
| -rw-r--r-- | lib/web/imageRouter/index.js | 42 | ||||
| -rw-r--r-- | lib/web/imageRouter/minio.js | 45 | ||||
| -rw-r--r-- | lib/web/imageRouter/s3.js | 50 | 
6 files changed, 183 insertions, 132 deletions
diff --git a/lib/web/imageRouter.js b/lib/web/imageRouter.js deleted file mode 100644 index 483be64b..00000000 --- a/lib/web/imageRouter.js +++ /dev/null @@ -1,132 +0,0 @@ -'use strict' -var fs = require('fs') -var url = require('url') -var path = require('path') - -const Router = require('express').Router -const formidable = require('formidable') -var imgur = require('imgur') - -const config = require('../config') -const logger = require('../logger') -const response = require('../response') - -const imageRouter = module.exports = Router() - -// upload image -imageRouter.post('/uploadimage', function (req, res) { -  var form = new formidable.IncomingForm() - -  form.keepExtensions = true - -  if (config.imageuploadtype === 'filesystem') { -    form.uploadDir = 'public/uploads' -  } - -  form.parse(req, function (err, fields, files) { -    if (err || !files.image || !files.image.path) { -      response.errorForbidden(res) -    } else { -      if (config.debug) { logger.info('SERVER received uploadimage: ' + JSON.stringify(files.image)) } - -      try { -        switch (config.imageuploadtype) { -          case 'filesystem': -            res.send({ -              link: url.resolve(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) -            const {getImageMimeType} = require('../utils') -            fs.readFile(files.image.path, function (err, buffer) { -              if (err) { -                logger.error(err) -                res.status(500).end('upload image error') -                return -              } -              var params = { -                Bucket: config.s3bucket, -                Key: path.join('uploads', path.basename(files.image.path)), -                Body: buffer -              } - -              var mimeType = getImageMimeType(files.image.path) -              if (mimeType) { params.ContentType = mimeType } - -              s3.putObject(params, function (err, data) { -                if (err) { -                  logger.error(err) -                  res.status(500).end('upload image error') -                  return -                } - -                var s3Endpoint = 's3.amazonaws.com' -                if (config.s3.region && config.s3.region !== 'us-east-1') { s3Endpoint = `s3-${config.s3.region}.amazonaws.com` } -                res.send({ -                  link: `https://${s3Endpoint}/${config.s3bucket}/${params.Key}` -                }) -              }) -            }) -            break - -          case 'minio': -            var utils = require('../utils') -            var Minio = require('minio') -            var minioClient = new Minio.Client({ -              endPoint: config.minio.endPoint, -              port: config.minio.port, -              secure: config.minio.secure, -              accessKey: config.minio.accessKey, -              secretKey: config.minio.secretKey -            }) -            fs.readFile(files.image.path, function (err, buffer) { -              if (err) { -                logger.error(err) -                res.status(500).end('upload image error') -                return -              } - -              var key = path.join('uploads', path.basename(files.image.path)) -              var protocol = config.minio.secure ? 'https' : 'http' - -              minioClient.putObject(config.s3bucket, key, buffer, buffer.size, utils.getImageMimeType(files.image.path), function (err, data) { -                if (err) { -                  logger.error(err) -                  res.status(500).end('upload image error') -                  return -                } -                res.send({ -                  link: `${protocol}://${config.minio.endPoint}:${config.minio.port}/${config.s3bucket}/${key}` -                }) -              }) -            }) -            break - -          case 'imgur': -          default: -            imgur.setClientId(config.imgur.clientID) -            imgur.uploadFile(files.image.path) -              .then(function (json) { -                if (config.debug) { logger.info('SERVER uploadimage success: ' + JSON.stringify(json)) } -                res.send({ -                  link: json.data.link.replace(/^http:\/\//i, 'https://') -                }) -              }) -              .catch(function (err) { -                logger.error(err) -                return res.status(500).end('upload image error') -              }) -            break -        } -      } catch (err) { -        logger.error(err) -        return res.status(500).end('upload image error') -      } -    } -  }) -}) diff --git a/lib/web/imageRouter/filesystem.js b/lib/web/imageRouter/filesystem.js new file mode 100644 index 00000000..25ec3846 --- /dev/null +++ b/lib/web/imageRouter/filesystem.js @@ -0,0 +1,18 @@ +'use strict' +const url = require('url') + +const config = require('../../config') + +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') { +    callback(new Error('Callback has to be a function'), null) +    return +  } + +  callback(null, url.resolve(config.serverurl + '/', imagePath.match(/^public\/(.+$)/)[1])) +} diff --git a/lib/web/imageRouter/imgur.js b/lib/web/imageRouter/imgur.js new file mode 100644 index 00000000..31d5f55c --- /dev/null +++ b/lib/web/imageRouter/imgur.js @@ -0,0 +1,28 @@ +'use strict' +const config = require('../../config') +const logger = require('../../logger') + +const imgur = require('imgur') + +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') { +    callback(new Error('Callback has to be a function'), null) +    return +  } + +  imgur.setClientId(config.imgur.clientID) +  imgur.uploadFile(imagePath) +  .then(function (json) { +    if (config.debug) { +      logger.info('SERVER uploadimage success: ' + JSON.stringify(json)) +    } +    callback(null, json.data.link.replace(/^http:\/\//i, 'https://')) +  }).catch(function (err) { +    callback(new Error(err), null) +  }) +} diff --git a/lib/web/imageRouter/index.js b/lib/web/imageRouter/index.js new file mode 100644 index 00000000..59f19253 --- /dev/null +++ b/lib/web/imageRouter/index.js @@ -0,0 +1,42 @@ +'use strict' + +const Router = require('express').Router +const formidable = require('formidable') + +const config = require('../../config') +const logger = require('../../logger') +const response = require('../../response') + +const imageRouter = module.exports = Router() + +// upload image +imageRouter.post('/uploadimage', function (req, res) { +  var form = new formidable.IncomingForm() + +  form.keepExtensions = true + +  if (config.imageuploadtype === 'filesystem') { +    form.uploadDir = 'public/uploads' +  } + +  form.parse(req, function (err, fields, files) { +    if (err || !files.image || !files.image.path) { +      response.errorForbidden(res) +    } else { +      if (config.debug) { +        logger.info('SERVER received uploadimage: ' + JSON.stringify(files.image)) +      } + +      const uploadProvider = require('./' + config.imageuploadtype) +      uploadProvider.uploadImage(files.image.path, function (err, url) { +        if (err !== null) { +          logger.error(err) +          return res.status(500).end('upload image error') +        } +        res.send({ +          link: url +        }) +      }) +    } +  }) +}) diff --git a/lib/web/imageRouter/minio.js b/lib/web/imageRouter/minio.js new file mode 100644 index 00000000..099cb926 --- /dev/null +++ b/lib/web/imageRouter/minio.js @@ -0,0 +1,45 @@ +'use strict' +const fs = require('fs') +const path = require('path') + +const config = require('../../config') +const {getImageMimeType} = require('../../utils') + +const Minio = require('minio') +const minioClient = new Minio.Client({ +  endPoint: config.minio.endPoint, +  port: config.minio.port, +  secure: config.minio.secure, +  accessKey: config.minio.accessKey, +  secretKey: config.minio.secretKey +}) + +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') { +    callback(new Error('Callback has to be a function'), null) +    return +  } + +  fs.readFile(imagePath, function (err, buffer) { +    if (err) { +      callback(new Error(err), null) +      return +    } + +    let key = path.join('uploads', path.basename(imagePath)) +    let protocol = config.minio.secure ? 'https' : 'http' + +    minioClient.putObject(config.s3bucket, key, buffer, buffer.size, getImageMimeType(imagePath), function (err, data) { +      if (err) { +        callback(new Error(err), null) +        return +      } +      callback(null, `${protocol}://${config.minio.endPoint}:${config.minio.port}/${config.s3bucket}/${key}`) +    }) +  }) +} diff --git a/lib/web/imageRouter/s3.js b/lib/web/imageRouter/s3.js new file mode 100644 index 00000000..bcd3ea60 --- /dev/null +++ b/lib/web/imageRouter/s3.js @@ -0,0 +1,50 @@ +'use strict' +const fs = require('fs') +const path = require('path') + +const config = require('../../config') +const {getImageMimeType} = require('../../utils') + +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') { +    callback(new Error('Callback has to be a function'), null) +    return +  } + +  fs.readFile(imagePath, function (err, buffer) { +    if (err) { +      callback(new Error(err), null) +      return +    } +    let params = { +      Bucket: config.s3bucket, +      Key: path.join('uploads', path.basename(imagePath)), +      Body: buffer +    } + +    const mimeType = getImageMimeType(imagePath) +    if (mimeType) { params.ContentType = mimeType } + +    s3.putObject(params, function (err, data) { +      if (err) { +        callback(new Error(err), null) +        return +      } + +      let s3Endpoint = 's3.amazonaws.com' +      if (config.s3.region && config.s3.region !== 'us-east-1') { +        s3Endpoint = `s3-${config.s3.region}.amazonaws.com` +      } +      callback(null, `https://${s3Endpoint}/${config.s3bucket}/${params.Key}`) +    }) +  }) +}  | 
