【问题标题】:Multiple File Upload and rename by multer in node.js多个文件上传并通过 node.js 中的 multer 重命名
【发布时间】:2016-08-25 05:48:45
【问题描述】:

我打算使用 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。似乎重命名函数打算获取可能仍在上传的文件。我不确定我的理解是否正确。如果是这样,有没有办法确定文件是否已完全上传?对我的问题有什么建议吗?

【问题讨论】:

    标签: node.js asynchronous multer


    【解决方案1】:

    为什么不使用 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 页面并将其上传,可能会给它一个不同的文件扩展名。它可以通过多种方式运行,例如,如果用户尝试在新选项卡中打开它,因为没有显示图像。这个问题的全部含义以及如何处理它是他们自己的话题。
    • 最后,非常非常非常确定用户不能写入上传文件夹以外的目录。当file.originalname 类似于../../index.js 时会发生什么?将文件名转换为 slug 可能会更好。

    【讨论】:

    • 谢谢。我刚刚尝试了 Multer 的内置功能,它确实按预期工作。顺便说一句,您知道是否有办法检查文件是否已在 multer 中完成下载?
    • @Liang 当它到达你的app.post 路由时,它就完成了。见github.com/expressjs/multer/issues/360#issuecomment-231001064stackoverflow.com/a/30458411/3714913
    • 再次感谢。从上面的两个帖子听起来很清楚。但是,我仍然怀疑它。正如一位会议所言,“有趣的是,在您展开时,该文件似乎不可用。”
    • @Liang 好吧,我不知道。除了别人的“没有工作”之外,您还有什么理由其他来怀疑它?在那种情况下,任何事情都可能是错误的,我们无法调查。不是说这不是 multer 的问题,只是不一定。
    • 我尝试更改文件名时怀疑文件尚未完全上传。我不太确定这一点。无论如何,现在我采用您提出的解决方案并再次感谢。
    猜你喜欢
    • 2016-05-22
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 2020-05-31
    相关资源
    最近更新 更多