tech.chakapoko.com
Home / Node.js / Express

[Node.js][Express]ファイルアップロードを実装する

インストール

ファイルのアップロードするには multer モジュールを使います。

$ npm install --save multer

1つのファイルをアップロードする

multer モジュールを使うと multipart/form-data リクエストでアップロードされたファイルの情報が req.file に入り、それ以外のデータが req.body に入ります。

次のコードはアップロードしたテキストファイルのファイル名とその中身をレスポンスとして返します。

multer({ dest: 'tmp/' }).single('file') で、fileというパラメータ名でファイルのアップロードリクエストを受け付け、アップロードされたファイルをtmp/に保存するという意味になります。

const express = require('express');
const fs = require('fs');
const multer = require('multer');

const app = express();

app.post('/upload', multer({ dest: 'tmp/' }).single('file'), (req, res) => {
    const filename = req.body.filename
    const content = fs.readFileSync(req.file.path, 'utf-8');
    res.send(filename + ': ' + content);
});

app.listen('3000', () => {
    console.log('Application started');
});
$ echo Hello > a.txt
$ curl http://localhost:3000/upload -F 'file=@a.txt' -F filename=a.txt
a.txt: Hello

複数のファイルをアップロードする

複数のファイルのアップロードを受け付け、配列としてファイル情報を受け取る時は single の代わりに array を使います。

const express = require('express');
const fs = require('fs');
const multer = require('multer');

const app = express();

app.post('/upload', multer({ dest: 'tmp/' }).array('file'), (req, res) => {
    const content1 = fs.readFileSync(req.files[0].path, 'utf-8');
    const content2 = fs.readFileSync(req.files[1].path, 'utf-8');
    res.send(content1 + content2);
});

app.listen('3000', () => {
    console.log('Application started');
});
$ echo Hello > a.txt
$ echo Goodbye > b.txt
$ curl http://localhost:3000/upload -F 'file=@a.txt' -F 'file=@b.txt'
Hello
Goodbye

もしくは fields を使います。

const express = require('express');
const fs = require('fs');
const multer = require('multer');

const app = express();

app.post(
    '/upload',
    multer({ dest: 'tmp/' }).fields([{ name: 'file1' }, { name: 'file2' }]),
    (req, res) => {
        const content1 = fs.readFileSync(req.files['file1'][0].path, 'utf-8');
        const content2 = fs.readFileSync(req.files['file2'][0].path, 'utf-8');
        res.send(content1 + content2);
    });

app.listen('3000', () => {
    console.log('Application started');
});
$ echo Hello > a.txt
$ echo Goodbye > b.txt
$ curl http://localhost:3000/upload -F 'file1=@a.txt' -F 'file2=@b.txt'
Hello
Goodbye