node.jsでフォームからAmazonS3へ画像ファイルをアップロードする29行
node.js(CoffeeScript)でWebフォームから画像などのファイルをAmazon S3へアップロードするサンプルコードです。
例えばHerokuを利用しているとファイルをアップロードしてもインスタンスが一定で無い為、すぐに削除されてしまいます。そこで一旦アップロードしたファイルをそのままAmazon S3に転送することでファイルが消えない様にする必要があります。
ここでは紹介するのは最小のサンプルである為、必要なエラー処理は入っていません。アクセス権限についても理解した上でご利用ください。
手順
1.AWSのS3 Management Consoleから「Create Bucket」でBucketを作ります。
2.作ったBucketのPropertiesのPermissionを選択、Add more permissionで「Authenticated Users」を追加、「Upload/Delete」を許可しておきます。
3.AWSのIdentity and Access Managementを開き、Userを作っておきます。「Users」を押して「Create New Users」で名前を入力。一度だけ「Access Key Id」と「Secret」が表示されますのでコピーしておきます。このUserでS3へファイルをアップロードすることになります。
4.以下のコードを実行します(CoffeeSciptで書かれています。適宜読み替えてください。) 先立ってrequireで指定されているモジュールをnpm installしておきます。
#!/usr/bin/env coffee
Http=require 'http'
Express=require 'express'
Fs=require 'fs'
Multer=require 'multer'
Aws=require 'aws-sdk'
Aws.config.update
accessKeyId:'ACCESS_KEY_ID'
secretAccessKey:'SECRET_ACCESS_KEY'
s3=new Aws.S3()
ap=Express()
ap.use Multer
dest:'.'
ap.get '/',(q,s)->
r="<html><body>"
r+="<form enctype='multipart/form-data' action='/upload' method='post'>"
r+="<input type='file' name='afile' ></input>"
r+="<input type='submit'></input>"
r+="</body></html>"
s.end r
ap.post '/upload',(q,s)->
buffer=Fs.readFileSync q.files.afile.path
s3.putObject
Bucket:'BUCKET_NAME'
Key:q.files.afile.name
Body:buffer
,(e,r)->
s.end 'ok'
Http.createServer(ap).listen(8080)
ACCESS_KEY_IDとSECRET_ACCESS_KEYとBUCKET_NAMEは先ほどコピーしたデータとバケット名に置き換えてください。
5.ブラウザから8080ポートを開きます。
注意点
- 一旦実行ディレクトリにファイルをアップロードしてそこからS3へ転送しています。実際は実行ディレクトリではなく、専用のディレクトリを指定してください。(Multerのdestプロパティ)
- 一時ファイルは溜まって行くので必要であれば削除する処理を加えてください。
- Herokuで使用する場合はportをprocess.env.PORTで指定してください。