当前位置: 首页 > 面试题库 >

在Express / NodeJS应用中提供S3中存储的文件

东郭宏深
2023-03-14
问题内容

我有一个应用,其中用户的照片是私人的。我将照片(也有缩略图)存储在AWS
s3中。网站上有一个页面,用户可以在其中查看他的照片(即缩略图)。现在,我的问题是如何处理这些文件。我评估过的一些选项是:

  • 使用签名的网址生成服务从CloudFront(或AWS)提供文件。但是问题是每次用户刷新页面时,我都必须再次创建这么多签名的URL并加载它。因此,我将无法在浏览器中缓存图像,这将是一个不错的选择。无论如何,仍然需要使用javascript吗?由于安全性问题,我无法长时间确保这些网址的有效性。其次,在此时间范围内,如果有人掌握了该URL,他可以查看文件而无需通过应用程序进行身份验证。
  • 另一种选择是在从S3服务器流式传输文件后,从我的Express应用程序本身提供文件。这使我可以拥有http缓存头,因此可以启用浏览器缓存。它还可以确保未经身份验证的任何人都无法查看文件。理想情况下,我想流式传输文件,并且我正在使用NGINX代理中继将另一端流式传输到NGINX。但正如我所见,只有文件存在于同一系统的文件中才有可能。但是在这里,我必须流式传输并在流式传输完成后返回。不想将文件存储在本地。

我无法评估这两个选项中的哪一个是更好的选择?我想将尽可能多的工作重定向到S3或Cloudfront,但是即使使用单个URL也会使请求首先到达我的服务器。我也想要缓存功能

那么什么是理想的方式呢?与这些方法有关的特定问题的答案?


问题答案:

我只是从S3流式传输。这非常容易,而签名的URL则困难得多。只要确保在将图像上传到S3时设置了content-typecontent- length标头即可。

var aws = require('knox').createClient({
  key: '',
  secret: '',
  bucket: ''
})

app.get('/image/:id', function (req, res, next) {
  if (!req.user.is.authenticated) {
    var err = new Error()
    err.status = 403
    next(err)
    return
  }

  aws.get('/image/' + req.params.id)
  .on('error', next)
  .on('response', function (resp) {
    if (resp.statusCode !== 200) {
      var err = new Error()
      err.status = 404
      next(err)
      return
    }

    res.setHeader('Content-Length', resp.headers['content-length'])
    res.setHeader('Content-Type', resp.headers['content-type'])

    // cache-control?
    // etag?
    // last-modified?
    // expires?

    if (req.fresh) {
      res.statusCode = 304
      res.end()
      return
    }

    if (req.method === 'HEAD') {
      res.statusCode = 200
      res.end()
      return
    }

    resp.pipe(res)
  })
})


 类似资料:
  • 我正在实施一个在Amazon S3中提供文件存储的应用程序,而用户使用普通文件进行操作 我有什么方法可以重命名/移动整个文件夹(从而递归地修改它的内容)? 或者我必须为每个资源手动实现递归解析和调用copy-delete吗? 谢谢

  • 问题内容: 我的目标: 显示一个对话框,提示用户保存从AWS下载的文件。 我的问题: 我目前正在使用awssum- amazon-s3创建下载流。但是,我仅设法将文件保存到服务器或将其流式传输到命令行…如您从我的代码中看到的那样,我的最后一次尝试是尝试手动设置失败的内容处置头。我无法使用res.download(),因为已经设置了标头? 我如何实现我的目标? 我的节点代码: 我的角度代码: 编写此

  • 问题内容: 我需要列出S3存储桶中某个文件夹中包含的所有文件。 文件夹结构如下 我有与用户有关的文件和与某个用户的联系人有关的文件。我需要同时列出两者。 要列出文件,我使用以下代码: 要列出某个用户的文件,我使用以下前缀: 并且我正确地获得了除子目录之外的目录中的所有文件,例如: 要列出某个用户联系人的文件,我使用以下前缀: 但是在这种情况下,我还将目录本身作为返回的对象: 为什么我会得到这种行为

  • 问题内容: 我有一个s3结构,如下所示: 我需要做的就是给定s3bucket的名称和一个第一级密钥的条目,我需要位于第一级密钥下的所有第二级密钥的名称。因此,从本质上来说,如果我们将其视为一个文件夹,则将获得的名称(即)和其子文件夹之一的名称,我想列出其中的所有文件夹。虽然只是名称,而不是完整的路径。 有人可以指出如何使用亚马逊的Java SDK在Java中做到这一点吗? 谢谢 问题答案: 我做了

  • 我有2个AWS帐户。我试图复制文件从帐户1到帐户2在桶2在美国西部2地区。我有所有必要的IAM政策,相同的凭据适用于两个帐户。我使用python boto3库。 如图所示,复制函数在指向目标帐户2/us-west-2的客户端对象上执行。它是如何获取帐户1/us-east1中的源文件的?我应该提供作为复制函数的输入吗?

  • 我希望我的Spark应用程序(Scala)能够读取S3文件 在我的开发机器上,我可以使用awscli访问S3文件在或中预先配置的配置文件,例如: 但是当尝试从Spark读取这些文件时,使用作为env变量提供的aws_配置文件(aws_配置文件),我得到了以下错误: DoesBucket存在于我的bucket名称中:com.amazonaws.AmazonClientException:BasicA