如何使用nodejs

时间:2018-01-17 08:26:04

标签: node.js amazon-s3

请告诉我如何使用nodejs从s3中检索图像?老实说,我可以使用nodejs将图像上传到s3,但问题是如何完成从s3检索图像?

router.get('/image/:imageId', function (req, res, next) {
    // ????
});

var s3 = new aws.S3({ accessKeyId: config.awsAccessId, secretAccessKey: config.awsAccessKey}); 
var upload = multer({
    storage: multerS3({
        s3: s3,
        bucket: config.bucket,
        key: function (req, file, cb) {
            cb(null, file.originalname);
        }
    })
});

router.post('/upload/:id', upload.array('file', 3), function(req, res, next) {
    res.send('Successfully uploaded ' + req.files.length + ' files!');
});

5 个答案:

答案 0 :(得分:7)

我终于找到了,

var params = { Bucket: config.bucket, Key: req.params.imageId };
s3.getObject(params, function(err, data) {
    res.writeHead(200, {'Content-Type': 'image/jpeg'});
    res.write(data.Body, 'binary');
    res.end(null, 'binary');
});

答案 1 :(得分:2)

假设您使用的是aws-sdk,那么您可以使用getObject方法。

以下是示例代码

exports.getObjects = function (req, res) {
    var item = req.body;
    var params = { Bucket: req.params.bucketName, Key: 'keyname'}; // keyname can be a filename
    s3.getObject(params, function (err, data) {
        if (err) {
            return res.send({ "error": err });
        }
        res.send({ data });
    });
}

link可能对您有所帮助。

答案 2 :(得分:1)

您正在寻找getObject()方法。

答案 3 :(得分:0)

一种更好,更快的方法是将流传递到响应中,可在Minio S3 Client上使用,但我相信它也可在aws Amazon js客户端上使用。

const Minio = require('minio');

const s3Client = new Minio.Client({
    endPoint: 'ep',
    accessKey: 'ak',
    secretKey: 'sk'
});

router.get('/image/:imageId', (req, res) => {

    const { imageId } = req.params;

    s3Client.getObject('bucket', imageId, (err, stream) => {
        if (err) return res.status(500).send(err);

        const contentType = stream.headers['content-type'];

        contentType && res.setHeader('Content-Type', contentType);

        stream.pipe(res);
    });
});


答案 4 :(得分:0)

如果您将 lambda 与 API 网关一起使用来检索图像,则无需使用具有适当权限的安全密钥。
从bucket中读取一张图片并以base64格式发送,直接在HTML中的图片标签源中使用。

const AWS = require('aws-sdk');
//*/ get reference to S3 client 
var s3 = new AWS.S3();
exports.handler = (event, context, callback) => {
    var params = {
  "Bucket": "bucket-name",
  "Key": "object-name"  
    };
    s3.getObject(params, function(err, data){
       if(err) {
           callback(err, null);
       } else {
           let image = new Buffer(data.Body).toString('base64');
           image = "data:"+data.ContentType+";base64,"+image;
           let response = {
        "statusCode": 200,
        "headers": {
            "Access-Control-Allow-Origin": "*",
            'Content-Type': data.ContentType
        },
        "body":image,
        "isBase64Encoded": true
    };
           callback(null, response);
    }
    });
    
};