0

nodejs、express & request モジュールを使用して画像をアップロードしようとしていますが、Amazon S3 インスタンスから 415 を取得し続けます。

    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);
            }


        }
    }));

リクエストに画像が追加されていないと思いますが、100%ではありません。何かアドバイスはありますか?

4

1 に答える 1

2

パイプは、パラメーターとして書き込み可能なストリームを想定しています。Express の res オブジェクトをパイプの宛先として直接使用できます。ただし、s3 にアップロードしたい場合は、req ストリームからファイルを読み取り、putObject を使用して 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({})
      }
});

ダウンロードしたい場合は、パイプを使用して読み取りオブジェクトを直接応答にリダイレクトできます

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 ? 
      }
    });    
  })
})
于 2013-10-24T23:45:48.573 に答える