teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記)

2020/10/01 06:59

投稿

AkitoshiManabe
AkitoshiManabe

スコア5434

answer CHANGED
@@ -2,4 +2,50 @@
2
2
 
3
3
  標準モジュール[FileSystem](https://nodejs.org/api/fs.html) で ``rename`` を検索してみてください。
4
4
 
5
- ``fs.rename()`` や ``fs.renameSync()``、``fs.promises.rename()`` がファイル名更新用のメソッドとして提供されています。
5
+ ``fs.rename()`` や ``fs.renameSync()``、``fs.promises.rename()`` がファイル名更新用のメソッドとして提供されています。
6
+
7
+ 追記)
8
+ > ``cb(null, file.originalname)`` //←複数ファイルを選択したときのここの実装方法がわかりません。
9
+
10
+ [multer.js DiskStorage](https://github.com/expressjs/multer#diskstorage) のサンプルと続く解説を確認してみてください。
11
+
12
+ > ```javascript
13
+ var storage = multer.diskStorage({
14
+ destination: function (req, file, cb) {
15
+ cb(null, '/tmp/my-uploads')
16
+ },
17
+ filename: function (req, file, cb) {
18
+ const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9)
19
+ cb(null, file.fieldname + '-' + uniqueSuffix)
20
+ }
21
+ })
22
+ > ```
23
+
24
+ サンプルでは**フィールド名** + **受信完了時刻(``Date``)** + **乱数** をサフィックスとして生成して同一のファイル名になることを回避しています。
25
+
26
+
27
+ ご質問に関係ありそうな内容を翻訳し、括弧書きで私の解釈を加えてみました。
28
+
29
+ > Google翻訳
30
+ * filename(オプション)は、フォルダー内でファイルの名前を決定するために使用されます。
31
+ ファイル名が指定されていない場合、各ファイルにはファイル拡張子を含まないランダムな名前が付けられます。注:Multerはファイル拡張子を追加しません。関数(``cb``)は、ファイル拡張子を含む完全なファイル名を返す必要があります。
32
+ (destination、filenameオプションに指定する)各関数には、(記録先ディレクトリやファイル名を)決定を支援するために、要求(req)とファイル(file)に関する情報の両方が渡されます。
33
+ req.bodyはまだ完全に入力されていない可能性があることに注意してください。
34
+ これは、クライアントがフィールドとファイルをサーバーに送信する順序によって異なります。
35
+
36
+
37
+ このサンプルを応用するなら、受信結果を確認できるように console.log() を仕込んで POSTをテストしながら命名方法を探ります。
38
+
39
+ Expressを稼働するターミナルにファイル名が出力されると思います。
40
+ **複数ファイルの場合、複数回表示されないか?**を確認してみてください。
41
+
42
+ ```javascript
43
+ filename: function(req, file, cb){
44
+ // console.log( req );
45
+ // console.log( req.files );
46
+ console.log( file.originalname );
47
+
48
+ const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9)
49
+ cb(null, file.fieldname + '-' + uniqueSuffix)
50
+ }
51
+ ```