はじめに
Node.jsでちょろちょろ〜っと、機能を実装したりすることがあるんですが……
フロント・サーバ両方まとめて対応していたんですが、サーバ側でファイルアップロードの処理を書かないといけなくなてしまって。
Expressでのアップロードファイルの操作の方法をだいぶド忘れしていたので、備忘録も兼ねて。
単純にアップロード
normal_upload.js
const express = require('express');
const multer = require('multer');
const app = express();
const upload = multer({ dest: 'uploads/' });
app.use(express.urlencoded({ extended: false }));
app.post('/upload', upload, async (req, res) => {
// await お好みのファイルの操作
// req.fileにファイルの情報
res.status(200).send('done file control.').end();
});
app.listen(process.env.PORT || 8080);
/uploadにpostで投げれば、これでひとまずアップロードできるようになりました!
問題点
これだと、このjsファイルの階層にuploadディレクトリが作成され、ファイルが配置され続けてしまいます
削除はどうするんだとか、容量はどうするんだとか、そもそも書き込めないサーバだったらどうしようとか、ロードバランサーの下に複数台のサーバがある場合とかとか。
メモリ上にファイルを読み込んでアップロード
memory_upload.js
const express = require('express');
const multer = require('multer');
const app = express();
const upload = multer({ storage: multer.memoryStorage() }).single('file');
app.use(express.urlencoded({ extended: false }));
app.post('/upload', upload, async (req, res) => {
// await お好みのファイルの操作
// req.fileにファイルの情報
res.status(200).send('done upload.').end();
});
app.listen(process.env.PORT || 8080);
multer.memoryStorage() で、ファイルの情報をメモリに読み込むようにしてみました。
ファイルのbuffer情報もあるので、前述の問題点はクリアした上で一通りの操作は前と変わらずできるはず?
問題点
巨大なファイルを送られると死ぬ。
こればっかりは仕方ないんだけれども、実際に死なれると困るので……そういう訳にもいかない感じです。
素直にS3やGCSの署名付きURLを使って直接アップロードできる仕組みを作るのが一番だなぁ