2016-12-12 104 views
0

我試圖從Node.js託管的應用程序中從Amazon S3存儲桶下載文件。使用Node.js從EC2實例下載AWS S3文件

var folderpath= process.env.HOME || process.env.USERPROFILE // tried using os.homedir() also 

var filename = 'ABC.jpg'; 
var filepath = 'ABC'; 

AWS.config.update({ 
    accessKeyId: "XXX", 
    secretAccessKey: "XXX", 
    region: 'ap-southeast-1' 
}); 

    var DOWNLOAD_DIR = path.join(folderpath, 'Downloads/'); 

    var s3 = new AWS.S3(); 
    var s3Params = {Bucket: filepath,Key: filename, }; 

    var file = require('fs').createWriteStream(DOWNLOAD_DIR+ filename); 
    s3.getObject(s3Params).createReadStream().pipe(file); 

此代碼工作正常在本地主機,但因爲實例FOLDERPATH回報不從實例工作「的/ home/EC2用戶」,而不是用戶的機器中下載文件夾的路徑,即類似「C:\用戶\名稱」。

請問我該如何下載文件到用戶機器?如何從ec2實例獲取用戶主目錄的路徑?

謝謝。

+2

作爲一個方面說明:將secretAccessKey保存在代碼中是一個壞主意。您應該創建IAM角色並將其分配給EC2實例。 –

+0

好的,我會的。謝謝@Sergey Kovalev –

+2

你是什麼意思的「不工作」?你有錯誤嗎? 'folderpath'是Linux機器上的一個正常目錄路徑(它是'ec2-user'的主目錄)。你確定'/ home/ec2-user/Downloads /'目錄是否存在,並且用戶有寫入權限? – GilZ

回答

1

您可以使用express來創建http服務器和API。您可以在Express.js入門中找到大量教程。 express.js的初始設置完成後,你可以做這樣的事情在Node.js的代碼:

AWS.config.update({ 
    accessKeyId: "XXX", 
    secretAccessKey: "XXX", 
    region: 'ap-southeast-1' 
}); 
var s3 = new AWS.S3(); 

app.get('/download', function(req, res){ 
    var filename = 'ABC.jpg'; 
    var filepath = 'ABC'; 
    var s3Params = {Bucket: filepath, Key: filename}; 
    var mimetype = 'video/quicktime'; // or whatever is the file type, you can use mime module to find type 

    res.setHeader('Content-disposition', 'attachment; filename=' + filename); 
    res.setHeader('Content-type', mimetype); 

    // Here we are reading the file from S3, creating the read stream and piping it to the response. 
    // I'm not sure if this would work or not, but that's what you need: Read from S3 as stream and pass as stream to response (using pipe(res)). 
    s3.getObject(s3Params).createReadStream().pipe(res); 
}); 

一旦做到這一點,你可以調用這個API /download,然後下載用戶的計算機上的文件。根據您在前端使用的框架或庫(或純JavaScript),可以使用此/download api下載文件。只是谷歌,如何使用XYZ(框架)下載文件。

+0

它返回文件的數據意味着我仍然在angular.js中寫入文件,這可能導致找到路徑並提供給createWriteStream() –

+0

非常感謝您的時間和精力,但我認爲使用易於使用的網址會很方便。 –