从节点访问 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 .
来提取路径
我有一个基本的节点应用程序,用户可以在其中登录并能够查看 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 .
来提取路径