代码之家  ›  专栏  ›  技术社区  ›  James

ReactJS:从S3渲染私有图像资源

  •  1
  • James  · 技术社区  · 7 年前

    我正在使用NodeJS后端API服务器,它允许前端(ReactJS/React Native)使用表单数据上传图像。这是我正在使用的代码:

    const s3 = new aws.S3({
      accessKeyId: process.env.AWS_ACCESS_KEY_ID,
      secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
      region: "us-east-1",
    });
    
    ...
    
    const upload = multer({
      storage: multerS3({
        s3,
        bucket: process.env.AWS_BUCKET,
        acl: 'private',
        metadata(req, file, cb) {
          cb(null, {fieldName: file.fieldname});
        },
        key(req, file, cb) {
          cb(null, Date.now().toString() + '.png');
        }
      })
    })
    
    ...
    
    app.post('/upload', upload.single('photo'), (req, res, next) => {
      res.json(req.file)
    })
    

    AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY .

    /render 以某种方式流到后端?如果是,我怎么做?

    AWS\访问\密钥\ ID AWS\u密钥\u访问\u密钥 用户的密钥?

    2 回复  |  直到 7 年前
        1
  •  12
  •   James    7 年前

    经过多次尝试和错误,我发现最优雅的解决方案是让NodeJS负责与S3的通信。前端将 GET

      app.get("/image/:imageId", function(req, res, next) {
        var params = { Bucket: keys.AWS_BUCKET, Key: req.params.imageId };
        s3.getObject(params, function(err, data) {
          if (err) {
            return res.send({ error: err });
          }
          res.send(data.Body);
        });
      });
    

    为什么我认为这比 卢博斯克

    首先,我不会在任何时候向公众公开资产。我只不过是露了点头而已 路由到最终用户。

    第二,如果我想限制对这条路线的访问,我可以简单地使用 passportJS

        2
  •  4
  •   luboskrnac    7 年前

    解决方案很简单:

    1. 随机化S3 URL,使其不可猜测(例如,使用UUID)
    2. 公开这些资产

    这是非常相同的概念,例如谷歌文档,Dropbox使用当你分享一个链接,并发送给某人。世界上的每个人都可以阅读这个链接,但是如果链接是不可猜测的,那么只有当你共享这个链接时,才能访问这个资产。

        3
  •  0
  •   J. Jerez    5 年前

    Amplify 相反。