首页 > 解决方案 > 从 S3 getObject() 中检索图像不起作用

问题描述

我正在尝试从 S3 获取图像,即使我认为我提供了正确的信息,我似乎也无法取回图像。

目前它在几秒钟后返回一个空值,它使页面看起来像是坏了/服务器在 5 秒内没有响应。

路线

// GET TEST
    app.get('/test',
    isAuthenticated,
    (req, res) => {
        var image;
        var params = {
            Bucket: "<bucket name>",
            Key: "<tried both the Etag and the file name both failed>"  
        };
        s3.getObject(params, (err, data) => {
           image = data;
           console.log('Data: ',data);
           res.render('test/test', {header: 'TEST', image: image});
       });
       console.log('Image: ', image);
    });

我从阅读文档中getObject()知道这似乎是我需要的,但实际上让它发挥作用已被证明是困难的。

AWS 配置

var aws = require("aws-sdk"),
    s3 = new aws.S3();
var config = require('../config/config');
aws.config.update({
   secretAccessKey: config.aws_s3.secretAccessKey,
   accessKeyId: config.aws_s3.accessKeyId,
   region: config.aws_s3.region
});

这取自我的代码库的一个已知工作部分。

我错过了什么文件没有下载?如果文件直接发送到客户端而不是发送到我的服务器然后是客户端,我也会喜欢它。

编辑

我已经得到它来给我一些数据,但仍然不会显示图像

数据

Data:  { AcceptRanges: 'bytes',
  LastModified: 2018-09-22T01:53:39.000Z,
  ContentLength: 2117,
  ETag: '"<Etag>"',
  ContentType: 'application/octet-stream',
  ServerSideEncryption: 'AES256',
  Metadata: {},
  Body: <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 00 30 00 00 00 30 08 06 00 00 00 57 02 f9 87 00 00 00 01 73 52 47 42 00 ae ce 1c e9 00 00 00 04 ... > }

标签: javascriptnode.jsamazon-s3

解决方案


我终于解决了这个问题,与我一直在尝试的方法和链接的方法相比,它采用了一种完全不同的方法。比链接方法简单得多。

有效的方法是使用我之前尝试getSignedUrl使用的功能。getOjbect

我的路线

// GET TEST
    app.get('/test',
    isAuthenticated,
    (req, res) => {
        var urlParams = {Bucket: config.aws_s3.logoBucket, Key: <key>'};
        logoBucket.getSignedUrl('getObject', urlParams, function(err, url){
            res.render('test/test', {header: 'TEST', url: url});
        });
    });

配置

var aws = require("aws-sdk");
var config = require('../config/config');
aws.config.update({
   secretAccessKey: config.aws_s3.secretAccessKey,
   accessKeyId: config.aws_s3.accessKeyId,
   region: config.aws_s3.region,
  sslEnabled: true
});
var s3 = new aws.S3();
var logoBucket = new aws.S3( { params: {Bucket: config.aws_s3.logoBucket} } )

推荐阅读