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ポートを開きます。

注意点

この記事を見た人がよく読んでいる記事

カナシスコム > 節約テクノロジ > node.jsでフォームからAmazonS3へ画像ファイルをアップロードする29行