【问题标题】:NodeJS Request Upload ImageNodeJS 请求上传图片
【发布时间】:2013-10-25 07:45:48
【问题描述】:

尝试使用 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%。有什么建议吗?

【问题讨论】:

    标签: node.js amazon-s3 request


    【解决方案1】:

    pipe 需要一个可写流作为参数。您可以直接使用 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 ? 
          }
        });    
      })
    })
    

    【讨论】:

    • 感谢 Kamrul,您的代码有效,但我希望避免使用 aws api。我设法让它与表单数据插件一起工作。
    • @kamrul 我尝试了相同的代码,我收到一个错误“TypeError: Cannot read property 'files' of undefined”。我正在使用 restify.js 框架。
    • @vivek,你能检查一下express处理的req对象是否包含files。否则请检查您的快速多部分设置。
    • @Kamrul 对不起.. 我使用的是 restify.js 框架而不是表达,所以 restify 有问题,你能帮忙吗。
    • @vivekP,如果您可以将您的问题作为一个单独的问题并解释您遇到错误的位置,我可以尝试帮助您。
    猜你喜欢
    • 2014-09-01
    • 2017-06-28
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 2019-03-21
    • 1970-01-01
    相关资源
    最近更新 更多