从Node访问s3存储桶

时间:2015-06-04 06:34:46

标签: node.js amazon-s3 elastic-beanstalk passport.js

我有一个基本节点应用程序,用户登录并能够查看存储在应用程序目录中的文件的链接。文件结构看起来像这样。

├──app

├──公开

├──node_modules

├──安全(存储在这里的文件)

├──.ebextensions

├──.elasticbeanstalk

├──package.json

└──app.js

secure/目录是我存储所有文件的地方(约350mb)。

这是指向该目录href="/secure/folder/document.pdf"

中文件的链接示例

我已将整个secure/文件夹移动到s3存储桶,以保持应用程序的文件大小。

有人会就如何允许我的节点应用程序访问此存储桶提出任何建议吗?

我在secure/的所有路由上都有中间件来检查用户是否经过身份验证,因此无法将链接分发给未登录的用户。

这是我的尝试!

var AWS = require('aws-sdk'),
 s3 = new AWS.S3({
   region : 'example_region' 
 });

app.get('/secure/:endpoint',function(req,res){
  var
    Stream = s3.getObject({
      Bucket: 'exampleBucket',
      Key: 'secure/' + req.params.endpoint
    }).createReadStream();
  Stream.pipe(res);
});

我可以访问类似于此href="/secure/userguide.pdf"的链接,但当您开始向文件系统深入1级以上时,例如href="/secure/foldar1/userguide.pdf",则会引发404错误。

2 个答案:

答案 0 :(得分:1)

将我的评论写入答案,因为这导致您找到解决方案。

您应该像这样重写路由:

app.get('/secure/*', function(req, res){...} 

因此,以 / secure / 开头的每个请求都将附加到此路由器。然后,您可以通过访问 req.originalUrl 来提取路径。

答案 1 :(得分:0)

除非我误解了这个问题,否则你不应该这样做。保存文件和S3 URI之间的关系,然后,在请求文件时,获取关系并使用S3 URI进行响应。

如果要在应用程序上实现访问控制,那么您应该从S3检索文件并将其提供给客户端,但同样,您应该只保存关系,而不是文件。

我通常做这样的事情:

伪代码:

var Model = {
  id: {type: "string"},
  file: {type: "string"}
}

其中file是S3 URI。您可以使用您需要的任何类型的访问控制来扩展此模型。