UTALI

みんなの役に立つ情報をどんどん公開していきます

Node.js - サーバー で ブラウザ や アプリ から アップロード された フォームデータ を受け取る - Multerを使う

Node.jsでサーバーでフォームデータを受け取る方法Multer

Node.jsでブラウザやアプリからアップロードされたデータを受け取るにはMulterを使うのがベストでしょう。Multerはmultipart/form-data形式のリクエストのみを受け取ることができます。このMulterは、Node.jsでもっとも人気のあるプロジェクトの1つであるGhost(WordPressのNode.js版だと思ってください)にも採用されている信頼あるパッケージです。

npmでインストール

sudo npm install --save muster
var multer = require("multer");
var upload = multer({dest: "./tmp"});

//nameにphotoを指定したファイルが/tmpディレクトリに保存される
router.post("/upload",upload.single("photo"),function(req,res,next){
 
  //req.fileにアップロードされたデータの情報が格納される。
 //req.bodyにはテキストデータが格納される。
})

//複数の画像をまとめてアップロードするにはsingleの代わりにarrayを使用する。
app.post('/upload_multi', upload.array('photos', 12), function (req, res, next) {
  // req.filesには複数の画像ファイルの情報が格納される。
})

Multerはテキストデータをreq.bodyに、画像や動画などのバイナリデータを任意のディレクトリに保存して、req.file(singleを指定した場合)、またはfilesオブジェクトにファイルの情報を追記します。

ファイル情報

各ファイルには、次の情報が含まれています。

キー 説明
fieldname フォームで指定されたフィールド名
originalname ユーザーのコンピュータ上のファイルの名前
encoding ファイルのエンコーディングタイプ
mimetype ファイルのMIMEタイプ
size ファイルのサイズ(バイト単位)
destination ファイルが保存されたフォルダ DiskStorage
filename 宛先DiskStorage内のファイルの名前 DiskStorage
path アップロードされたファイルへのフルパス DiskStorage
buffer バッファAファイル全体のバッファ MemoryStorage

multerオブジェクト

//multerオブジェクトの宣言
var multer = require("multer");

Multerには少なくとも1つのオプションを渡す必要があります。最も基本的なものはdestで、Multerにファイルのアップロード先を指示します。 オプションを省略すると、ファイルはメモリに保持され、ディスクには書き込まれません。

デフォルトでは、名前の競合を避けるために、Multerはファイルの名前を変更します。 もちろん必要に応じて名前とパスを変更することができます。

以下は、Multerに渡すことができるオプションです。

キー 説明
dest ファイルを格納する場所を指定 {dest: "./tmp"}
storage ファイルのパスと名前を指定できる 以下で説明
fileFilter ファイルタイプを制限する関数を指定 以下で説明
limits データサイズの制限 以下で説明

multerのメソッド

受け取るファイルについてはsingle(),array(),none(),any()のいずれかを指定

single()

指定したフィールドのファイルを1つだけ受け取ります。 その情報はreq.fileに格納されます。

array(fieldname [maxCount])

指定したフィールドの複数ファイルを受け取ります。 その情報はreq.filesに格納されます。maxCountでその最大数を制限できます。

none()

テキストフィールドのみを受け入れます。 ファイルがアップロードされると、コード "LIMIT_UNEXPECTED_FILE"のエラーになります。

any()

すべてのファイルを受け入れます。ファイルの情報はreq.filesに格納されます。 悪意のあるユーザーに利用される危険性があるので極力使用しないほうがいいでしょう。

Storage

DiskStorage

ディスクストレージは、ファイルをアップロードしたときのパスと名前を柔軟にコントロールすることができます。

ディスクストレージはmulterのメソッドとして呼び出すことができ、その要素としてdestination、filenameの二つの関数を渡します。両方の関数もreq, file, cbの3つの引数をとり、それは順番に、クライアントからのリクエスト、ファイルの情報、コールバックに対応します。

destination

アップロード先のファイルを保存するフォルダを決定するために使用されます。それはコールバックの第二引数として相対パスを指定します。指定されていない場合、OSの一時ファイルに割り当てられるディレクトリが使用されます。

注意点としてはmulterはディレクトリが作成されていることを保証しないということで、事前にfs.mkdirなどを利用して任意のディレクトリを作成する必要があります。

filenameは、保存するファイルの名前を決定するために使用されます。それはコールバックの第二引数としてファイル名前を指定します。ファイル名を指定しない場合、ファイルにはランダムな名前が与えられます。

注意点として、ファイル拡張子はユーザーの側で指定する必要があります。 req.bodyにはまだ完全に入力されていない可能性があることに注意してください。クライアントがフィールドとファイルをサーバーに送信する順序によって異なります。

memoryStorage

メモリストレージエンジンは、ファイルをバッファオブジェクトとして、メモリに格納します。 オプションはありません。

var storage = multer.memoryStorage()
var upload = multer({storage:storage}

メモリストレージを使用する場合、ファイル情報にはファイル全体を含むbufferというフィールドが含まれます。

警告:この機能はメモリの領域を大きく消費する可能性があります。

limits

ファイルのサイズやリクエストなどの制限を指定するオブジェクト。Dos攻撃を避けるため厳密な設定を行うべきでしょう。

次の整数値を使用できます。

キー 説明 デフォルト値
fieldNameSize 最大フィールド名のサイズ 100バイト
fieldSize 1つのファイルの最大サイズ 1MB
fields 非ファイルフィールドの最大数 無限
fileSize 最大ファイルサイズ(バイト) 無限
files 複数のファイルをアップロードするときのフィールドの最大数 無限
parts テキストデータを含むフィールドの最大数 無限
headerPairs パースするキー・値のペアの最大数 2000

multer({storage: storage, limits: { fileSize: 7000000, files:10 }})

fileFilter

ファイルのフィルタを柔軟に制御する関数です。

エラー処理

uploadの中でエラーハンドリングを実装することも可能です。

  upload(req, res, function (err) {
    if (err) {
      // An error occurred when uploading
      return
    }

    // Everything went fine
  })