Node.js + Expressの環境でファイルをアップロードする処理

nodejs_upload-fileTitaniumで開発しているアプリからファイルをアップロードして保存する処理を開発していたときの覚書。

環境:node.js v0.10.22, express v3.4.6, busboy v0.0.12

よく見かけるのは

app.use(express.bodyParser());

としてreq.filesを参照する方法。しかし、これを記述すると下記エラーをnodejsが出力する。

connect.multipart() will be removed in connect 3.0
visit https://github.com/senchalabs/connect/wiki/Connect-3.0 for alternatives
connect.limit() will be removed in connect 3.0

リンク先を見ると、ディスクにファイルを保存するのはセキュリティ上の問題から非推奨となり、他のパーサーを使えとある。

multipartybusboyを試した結果、難易度は上がるけどbusboyを使ってストリーム形式で処理することにした。

理由は

busboyはアップロードするファイルサイズを制限できる

から。

ちなみにmultipartyはTitaniumからアップロードしたcontent-typeに対応してない(multiparty3.1.0で確認)。こちらのissue#29にあるように正規表現を直せば対応可能。

サンプルコードはGitHubのReadmetestを見れば何となく分かると思う。

 

実際に使ってみた注意点をいくつか(※v0.0.12)

  • アップロードしたファイル名が日本語だとfilenameが化ける。issue#20に上がってる
    → filenameを使わない実装を推奨
    → ちなみにmultipartyは大丈夫
    → v0.0.13で修正されたらしい。試してない。 
  • busboy.on('file')の中でfileに対して操作をしないとbusboy.on('end')が発生しない。このissue#16で説明してる。
  • ファイルサイズの制限に引っかかったら「limit」イベントが発生するので、書き込み中のファイルは自前で削除する必要がある。

 

< Related Posts >