多个文件上传并由node.js中的multer重命名

时间:2016-08-25 05:48:45

标签: node.js asynchronous multer

我打算使用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()不断返回错误&#34; 1&#34;。目标文件夹中重命名的文件总是1Kb。似乎重命名函数打算获取可能仍在上传的文件。我不确定我的理解是否正确。如果是这样,有没有办法确定文件是否已完全上传?对我的问题有任何建议吗?

1 个答案:

答案 0 :(得分: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 
})

但是,如果你采用这种方法,你应该注意几件事情:

  • 客户端可以发送任何类型的文件,其中包含任何(可能不正确的)扩展名。这是一种潜在的安全风险。
  • 如果使用相同名称上传两个文件,则第二个文件将覆盖第一个文件。
  • 如果您将这些文件提供给其他用户,则安全风险会大大增加。攻击者可以创建脚本或HTML页面并上传它,可能会为其提供不同的文件扩展名。有几种方法可以运行,例如,如果用户试图在新标签中打开它,因为图像没有显示。这个问题的全部含义,以及如何处理它,都是他们自己的主题。
  • 最后,非常非常确定用户无法写入uploads文件夹以外的目录。当file.originalname类似于../../index.js时会发生什么?将文件名转换为slug可能更好。