2015-06-04 193 views
0

我有一個基本節點應用程序,用戶登錄並能夠查看存儲在應用程序目錄中的文件的鏈接。文件結構看起來像這樣。從節點訪問s3存儲桶

├──應用

├──公共

├──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個多層次深入到文件系統e.g href="/secure/foldar1/userguide.pdf"它拋出一個404錯誤。

+0

爲什麼不讓你的路由像這樣:app.get('/ secure /:folder /:endpoint',function(req,res){...}? –

+0

感謝Kiet,問題是有些文件是3-在這種情況下,我建議你使用下面的路由,app.get('/ secure/*',function(())/(安全/文件夾1 /文件夾2 /文件夾3 /文件.pdf) – sebko

+1

req,res){...},那麼每一個以/ secure /開始的請求都會附加到這個路由器上,並且你可以使用req.originalUrl來獲取路徑。 –

回答

1

將我的評論寫入答案,因爲這導致您找到解決方案。

你應該重寫你的路由是這樣的:

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

因此每個請求與/安全/將被連接到該路由器開始。然後,您可以通過訪問req.originalUrl來提取路徑。

0

除非我誤解了這個問題,否則你不應該這樣做。保存文件和S3 URI之間的關係,然後在請求文件時獲取關係並用S3 URI進行響應。

如果您想要在應用程序上實現訪問控制,那麼您應該從S3中檢索文件並將其提供給客戶端,但是應該只保存關係,而不是文件。

我平時做這樣的事情:

僞代碼:

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

如果文件是S3 URI。您可以使用您需要的任何類型的訪問控制來擴展此模型。

+0

謝謝路易斯, 你的意思是這樣嗎? 對不起,我試圖在這裏張貼代碼,但它不會讓我很好地打包! app.get('/ myimage',function(req,res){request('http://s3-us-west-2.amazonaws.com/my-bucket/myobject.jpg').pipe res); }); – sebko