从节点访问 s3 存储桶

Accessing a s3 bucket from Node

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

├── 应用

├── public

├── node_modules

├── 安全(文件存放于此)

├── .ebextensions

├── .elasticbeanstalk

├── package.json

└── app.js

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

这是一个 link 到该目录 href="/secure/folder/document.pdf"

中文件的示例

我已将整个 secure/ 文件夹移至 s3 存储桶以减小我的应用程序的文件大小。

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

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

这是我的尝试!

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" 的 link,但是当您开始深入文件系统超过 1 级时,例如 href="/secure/foldar1/userguide.pdf" 它会抛出 404错误。

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

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

我经常这样做:

伪代码:

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

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

将我的评论作为答案,因为这会引导您找到解决方案。

你应该像这样重写你的路由:

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

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

来提取路径