我有一个基本节点应用程序,用户登录并能够查看存储在应用程序目录中的文件的链接。文件结构看起来像这样。
├──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错误。
答案 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。您可以使用您需要的任何类型的访问控制来扩展此模型。