2016-12-12 36 views
0

Amazon S3バケットからNode.jsホストアプリケーションからファイルをダウンロードしようとしています。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ため、インスタンスから動作しません。つまり、何かC」などの代わりに、ユーザマシンのダウンロードフォルダのパスの「/ホーム/ EC2-ユーザー」:\ Users \ユーザー名"。

どうすればユーザーのマシンにファイルをダウンロードできますか?どのように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を使用してファイルをダウンロードできます。ちょうどGoogle、XYZ(フレームワーク)を使用してファイルをダウンロードする方法。

+0

これはファイルのデータを返しますが、angle.jsにファイルを書き込んでいて、おそらくパスを見つけてcreateWriteStream()に提供しているということを意味します。 –

+0

あなたの時間と努力のためにありがとうございますが、歌ったURLは使いやすいと思います。 –

関連する問題