2016-08-25 49 views
1

複数のファイルをアップロードして元の名前に戻すには、multerを使用することを考えました。以下はサンプルコードです複数のファイルをアップロードし、node.jsのmulterで名前を変更

var express = require('express'); 
var app = express(); 
var fs = require("fs"); 

var multer = require('multer'); 

app.use(express.static('public')); 
var upload = multer({ dest: './upload/' }); 

app.get('/index.html', function (req, res) { 
    res.sendFile(__dirname + "/" + "index.html"); 
}) 

app.post('/file_upload', upload.array('theFile', 2), function (req, res, next) { 

    var errorcode = 0; 
    for (var i = 0; i < req.files.length; i++) { 
     fs.rename(req.files[i].path, req.files[i].destination + req.files[i].originalname, function (err) { 
      errorcode = err; 
     }(i)); 
    } 

    if (errorcode != 0) { 
     console.log("errorcode is " + errorcode); 
     res.sendStatus(500); 
     return; 
    } else { 
     res.json({ 
      message: 'File uploaded successfully', 
     }); 
    } 
}) 


var server = app.listen(8089, function() { 

    var host = server.address().address 
    var port = server.address().port 

    console.log("Example app listening at http://%s:%s", host, port) 

}) 

私はWindowsサーバー上で上記のコードをテストしています。私の見解では、ファイルは正常にアップロードできますが、fs.rename()はエラー「1」を返し続けます。そして、ターゲットフォルダ内の名前が変更されたファイルは常に1Kbです。リネーム機能はまだアップロードされている可能性があるファイルを取得しようとしているようです。私の理解が正しいかどうかはわかりません。もしそうなら、ファイルが完全にアップロードされているかどうかを判断する方法はありますか?私の問題に対する提案はありますか?

答えて

0

なぜMulterの組み込み名前変更機能を使用しないのですか?で、クライアントは任意の種類のファイルを送信することができます

  • var storage = multer.diskStorage({ 
        destination: '/path/to/uploads/folder', 
        filename: function (req, file, cb) { 
        // Here we specify the file name to save it as 
        cb(null, file.originalname); 
        } 
    }) 
    
    // And we can use it for example like this: 
    app.post('/upload', upload.single('image'), function (req, res, next) { 
        // req.file is the `image` file 
        // req.body will hold the text fields, if there were any 
    }) 
    

    は、しかし、あなたがこのアプローチを取る場合は、あなたが知っておくべきカップルの事があります:ドキュメントから適応

    任意の(潜在的に不正確な)拡張。これは潜在的なセキュリティリスクです。

  • 2つのファイルが同じ名前でアップロードされている場合、2番目のファイルは最初のファイルを上書きします。
  • これらのファイルを他のユーザーに提供すると、セキュリティリスクが大幅に増加します。攻撃者は、スクリプトやHTMLページを作成してアップロードすることができます。おそらく、ファイル名の拡張子を変えることもできます。画像が表示されなかったためにユーザーが新しいタブで開こうとするなど、いくつかの方法で実行することができます。これの完全な意味とそれに対処する方法は、彼ら自身の話題です。
  • 最後に、ユーザーがuploadsフォルダ以外のディレクトリに書き込めないことを確認してください。 file.originalname../../index.jsのようなものの場合はどうなりますか?ファイル名をスラッグに変換する方が良いかもしれません。
+0

ありがとうございました。私はMulterの組み込み機能を試したところ、期待どおりに動作しました。ところで、あなたは、ファイルがマルターでダウンロードされたことを確認する方法があるかどうか知っていますか? – Liang

+0

@Liangあなたの 'app.post'ルートに到達すると、それは完了です。 https://github.com/expressjs/multer/issues/360#issuecomment-231001064およびhttp://stackoverflow.com/a/30458411/3714913 – Nateowami

+0

を再度ご覧ください。上記の2つの投稿からはっきりと聞こえます。しかし、私はまだそれを疑っています。 「興味深いことに、このファイルは、あなたが展開した時点では利用できなかったようだ」と語った。 – Liang

関連する問題