【问题标题】:Trying to display an image stored in aws S3 to React application尝试将存储在 aws S3 中的图像显示到 React 应用程序
【发布时间】:2021-02-04 23:16:09
【问题描述】:

我有一个私有 aws s3 容器,里面装满了我想在我的 SPA 上使用的图像。在后端,我使用 express 来尝试访问这些图像。这是我在节点上的代码,我从 s3 容器中获取对象,但我不知道如何从前端显示图像,有没有办法做到这一点?我是否必须公开我的 s3 容器并使用 URL,我希望避免这种情况。谢谢

let express = require('express')
let router = express.Router();
const aws = require('aws-sdk');
require('dotenv').config();



    router.get('/', async (req,res) => {
    
        try{
            aws.config.setPromisesDependency(); //use so you can promisify to get the actual images
            aws.config.update({
                accessKeyId: process.env.ACCESSKEYID,
                secretAccessKey: process.env.SECRETACCESSKEY,
                region: 'us-east-1'
            });
    
            const s3 = new aws.S3();
             const list = await s3.listObjectsV2({
                Bucket: 'xxx-xxx-xxx'
            }).promise()
    
            res.send(list)
    
        } catch(e) {
            console.log('our error is',e)
        }
        
    
                
    })
    
    module.exports = router;

可能是我必须更改 Content-Type 吗?因为当我得到这个响应时,当我在 chrome 开发者工具中阅读它时,它是“application/json; charset=utf-8”。

【问题讨论】:

    标签: node.js amazon-web-services express amazon-s3


    【解决方案1】:

    您可以将存储桶保密,您只需要使用来自 aws-SDK 的 getSignedURLPromise()

    var params = {Bucket: 'xxx-xx-xxx', Key: '1.jpg'};
    var promise = s3.getSignedUrlPromise('getObject', params);
    promise.then(function(url) {
      res.send(url)
    }, function(err) { console.log(err) });
    

    这实际上是您获得安全使用的 URL 所需的全部内容,您甚至可以设置其可用时间限制。

    我找到了答案here

    【讨论】:

    • 另外,如果你想下载/显示多张图片,你可以得到 listObjectsV2() 并使用长度运行一个循环。
    • 如果是签名的 URL,这会引发 CORS 错误吗?
    • 我正在尝试在组件上显示存储桶中的图像,然后单击按钮创建新画布并将 s3 对象图像附加到画布并将整个画布下载为 png。
    【解决方案2】:

    您对 aws s3 的反应如何? 在前端,您只需从后端调用 api,您将获得 json 格式的数据。比如你的回复是这样的

    contents: [{
      'key': 'photo1',
      'url': 'www.xxxxxxx.com/photo1.png'
     }]
    

    那么你要做的是在前端部分你必须通过你将从后端收到的url来设置你的img标签的src。

    <img src={url} />
    

    【讨论】:

    • 可能是因为它的 listsObjectv2(),但是当我收到回复时,我的内容数组中没有“url”。你认为它是在 listsObject() 的第一个版本中吗?
    • 您从响应中获得的 URL 不应通过在浏览器中输入或将其放入图像源来访问。在创建存储桶时,您应该为 IAM 用户设置权限,并且这些权限应该是最小的,只让应用程序消费者执行必要的操作(在大多数情况下,它是读取、上传和删除文件)。用户,我的意思是应用程序消费者(在他的情况下是快递服务器)。允许每个人看到任何图像是一个安全问题,因为您很可能不希望每个人都看到您的私人数据。因此,将 URL 分配给图像源应返回状态 403(禁止)。
    猜你喜欢
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多