質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

1回答

1731閲覧

node.js + multerで複数ファイルをアップロードしたい。

pyon_214

総合スコア8

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2020/09/29 09:00

編集2020/10/02 09:33

node.jsとmulterで複数ファイルをアップロードしたいのですが、複数ファイルのファイル名それぞれに1,2,3のようなナンバリングをつけてアップロードをする実装方法がわかりません。素人質問で恐縮ですがお知恵を貸していただけたら幸いです。

アップロードは正常に出来るのですがファイル名の変え方がわからないため困っています。

route.js

1var multer = require("multer"); 2 3var storage = multer.diskStorage({ 4 destination: function(req, file, cb){ 5 cb(null, `./public/${process.env.NODE_ENV}/images/cars`) 6 }, 7 filename: function(req, file, cb){ 8 cb(null, file.originalname) //←複数ファイルを選択したときのここの実装方法がわかりません。 9 } 10 }); 11 12var upload = multer({storage: storage}); 13 14router.post("/regist/execute",upload.any(),(req,res)=>{ 15 16 var original = createRegistData(req); 17 var errors = validateRegistData(req.body); 18 console.log(original) 19 if(errors){ 20 res.render("./posts/regist-form.ejs", { errors, original, MAKES, TYPES}); 21 return 22 } 23 24});

ejs

1 <form enctype="multipart/form-data"> 2 3 4 <!--image --> 5 <div class="form-group"> 6 <label>Make</label> 7 <input type="file" class="form-control" id="image" name="image" multiple /> 8 </div> 9 10 11 <!-- submit button --> 12 <input type="submit" class="btn btn-primary" data-method="POST" data-action="/posts/regist/execute" value="Regist"> 13 </form>

【追記】
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ファイル名の変え方

標準モジュールFileSystemrename を検索してみてください。

fs.rename()fs.renameSync()fs.promises.rename() がファイル名更新用のメソッドとして提供されています。

追記)

cb(null, file.originalname) //←複数ファイルを選択したときのここの実装方法がわかりません。

multer.js DiskStorage のサンプルと続く解説を確認してみてください。

javascript

var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, '/tmp/my-uploads')
},
filename: function (req, file, cb) {
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9)
cb(null, file.fieldname + '-' + uniqueSuffix)
}
})

サンプルではフィールド名 + 受信完了時刻(Date) + 乱数 をサフィックスとして生成して同一のファイル名になることを回避しています。

ご質問に関係ありそうな内容を翻訳し、括弧書きで私の解釈を加えてみました。

Google翻訳

  • filename(オプション)は、フォルダー内でファイルの名前を決定するために使用されます。

ファイル名が指定されていない場合、各ファイルにはファイル拡張子を含まないランダムな名前が付けられます。注:Multerはファイル拡張子を追加しません。関数(cb)は、ファイル拡張子を含む完全なファイル名を返す必要があります。
(destination、filenameオプションに指定する)各関数には、(記録先ディレクトリやファイル名を)決定を支援するために、要求(req)とファイル(file)に関する情報の両方が渡されます。
req.bodyはまだ完全に入力されていない可能性があることに注意してください。
これは、クライアントがフィールドとファイルをサーバーに送信する順序によって異なります。

このサンプルを応用するなら、受信結果を確認できるように console.log() を仕込んで POSTをテストしながら命名方法を探ります。

Expressを稼働するターミナルにファイル名が出力されると思います。
**複数ファイルの場合、複数回表示されないか?**を確認してみてください。

javascript

1filename: function(req, file, cb){ 2// console.log( req ); 3// console.log( req.files ); 4 console.log( file.originalname ); 5 6 const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9) 7 cb(null, file.fieldname + '-' + uniqueSuffix) 8}

投稿2020/09/29 09:59

編集2020/10/01 06:59
AkitoshiManabe

総合スコア5432

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pyon_214

2020/10/02 09:28

とてもわかり易いご回答ありがとうございます。 現在私は簡単な自動車販売サイトを制作しておりまして、画像を複数登録した上でその画像名をMongoDBなどに保存しておきたいのですが、 ファイル名を 「req.body.maker + "-" + req.body.type + "-" +"1,2,3などの固有のナンバリング"'」 という形式にしたいと考えていて、固有のナンバリングの設定方法とreq.body.makerなどをファイル名に入れる方法がわからずに困っています。 具体的には、req.body.makerなどはMongoDBに登録することは出来るのですが、multerで登録する際のstorageのfilenameの段階ではundefinedになってしまいます。 この点について教えていただけると助かります。つたない文章で申し訳ございません。
pyon_214

2020/10/02 09:34

追記に画像を追加しましたが、multer.diskStorage内でconsole.log(req.body)をしたところ、このようになります。
pyon_214

2020/10/02 09:40

自分で試行錯誤を繰り返したところ、おそらくmulterのdiskStrageを設定している段階ではreq.bodyが情報を最後まで受け取っていないようで、フロントエンド側で画像を入力欄の一番下にしたところreq.body.makerなどをすべて受け取ることができました。 しかし、できれば画像のアップロード欄はフォームの上のほうに配置したいため解決する方法はございませんでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問