DanyZift
DanyZift

Reputation: 687

NodeJS Request Upload Image

Trying to upload an image using nodejs, express & request module but keep getting 415 from Amazon S3 instance.

    fs.createReadStream(req.files.image.path).pipe(request.post(defaults.url, {
        form: {
            param_1: '',
            param_2: ''
        }
    }, function(error, response, body){
        if(error){
            callback(error, null);
        }else{

            if(response.statusCode === 200){

                callback({}, body);

            }else{

                callback(body, response);
            }


        }
    }));

I think the image is not getting appended on the request but i'm not 100%. Any advise?

Upvotes: 0

Views: 3608

Answers (1)

Kamrul
Kamrul

Reputation: 7311

pipe expects a Writable stream as parameter. you can use res object of express directly as the pipe destination. But if you like to upload to s3, you can read the file from req stream and use putObject to write it to s3

var fs = require ('fs')
fs.readFile(req.files.image.path, function (err, data) {

    var AWS = require('./aws_config')
    var s3 = new AWS.S3()
    var bucket =  ''
    s3.putObject({
      ACL: 'public-read', // by default private access
      Bucket: bucket,
      Key: file_name,
      Body: data
    }, function (err, data) {
      if (err) {
        console.log(err)
        res.send(500, {msg: 'image upload failed', error: err})
      } else {
        console.log('S3 upload Successful')

        res.send({})
      }
});

If you like to download you can use pipe to redirect the read object to response directly

app.get('/download/:file', function(req, res, next) {
  var AWS = require('./aws_config')
  var s3 = new AWS.S3()
  s3.getObject({
    Bucket: '',
    Key: req.params.file 
  }, function (err, data) {
    if (err) console.log (err)
    var fs = require ('fs')
    var filePath = __dirname + "/downloads/" + req.params.file
    fs.writeFile(filePath, data.Body, function (err) {
      if (err) console.log(err)
      else {
        res.attachment(filePath) 
        var filestream = fs.createReadStream(filePath);
        filestream.pipe(res);
        // TODO: delete file from server ? 
      }
    });    
  })
})

Upvotes: 2

Related Questions