使用 Multer 上传文件,而不知道它们的字段名

Posted

技术标签:

【中文标题】使用 Multer 上传文件,而不知道它们的字段名【英文标题】:Uploading files using Multer, without knowing the their fieldname 【发布时间】:2015-10-31 02:29:13 【问题描述】:

看完这篇文章: http://lollyrock.com/articles/express4-file-upload/

我发现,当您不知道要上传的表单字段的名称时,Multer 曾经允许上传文件。例如,如果您查看文章的“使用 Multer”部分,您会发现作者在调用 app.use() 时并没有使用 .single().array().fields()。如果您使用当前版本的 Multer 执行此操作,您将收到错误 TypeError: app.use() requires middleware functions

虽然我对如何使用 .single().array().fields() 有一点想法,但我当前的项目要求我向服务器发送不特定数量的文件(可能是一系列 @987654331 @ 或 .log 文件)。因此,我事先不知道字段名称是什么。

使用文章中使用的 Multer 版本 (0.1.6) 很容易做到这一点,但在当前版本的 Multer (1.0.3) 中尝试这样做似乎是不可能的,因为您需要指定表单字段名。

另外,在线查找 Multer 的完整指南一直是一项挑战,因为最好的似乎是 GitHub 存储库的自述文件,而似乎缺少该自述文件。也许我正在寻找的答案会在某个地方的指南中。

谢谢!

【问题讨论】:

为什么你不能控制字段名?显然,您无法控制 文件 名称。你是这个意思吗? 我的意思是字段名称。而且我无法控制字段名称,因为我不确定我会收到多少文件。编辑:我正在仔细研究 .fields() ,这可能是我正在寻找的答案。但我需要为此控制文件名。 如果您使用multer().array('foo'),那么您可以拥有任意数量的文件,只要每个文件的字段名称相同(foo)。确定要求客户端为每个文件使用相同的字段名称不是不可能的吗? 这可能是我需要强制执行的事情,但这是可行的。 @SammyI。 Multer 是专门编程的,因此由于Issue 133 中概述的安全原因,您需要事先了解这些字段。虽然我们也许可以添加一个.any() 方法,但我宁愿把它排除在外。似乎@mscdex 提出的方式就是要走的路。有什么理由不适合你吗? 【参考方案1】:

只需使用 multer.any() 即可在 request.files 中获取这些文件。

var router   = express.Router();
var app      = express();    
var _fs      = require("fs");
var _config  = require("./config");
var multer   = require("multer");
var upload   = multer( dest: _config.tempDir )

app.use(bodyParser.urlencoded(extended:true));

app.post("/api/files", upload.any(),  function(req, res)             
    var files = req.files;
   if(files)
        files.forEach(function(file)

            //Move file to the deployment folder.
            var newPath =  _utils.DetermineFileName(file.originalname, _config.destinationDir);
            _fs.renameSync(file.path, path.join(_config.destinationDir, newPath));
            var newFileName = path.basename(newPath);
            console.log(newFileName + ' saved at '  + _config.destinationDir );
        );
    
;

【讨论】:

这在打字稿中不起作用。我正在尝试类似的代码。当试图将 req.files 分配给数组变量时,它会出错,如下所示 -------------- 键入'File[] | [字段名:字符串]:文件[]; ' 不可分配给类型 'File[]'。键入' [字段名:字符串]:文件[]; ' 缺少类型“File[]”的以下属性:length、pop、push、concat 和 26 more.ts(2322) -------------------- - 此外,files.forEach 不起作用,因为 files 不是数组。有人知道这个问题的任何解决方案吗? 我有解决方案 const filesArr: any | Express.Multer.File[] = req.files;然后检查 if(Array.isArray(filesArr)) // 你的代码在这里 然后代码不会出错。谢谢【参考方案2】:
multer().any();

没有测试过,但应该可以。

【讨论】:

【参考方案3】:

现在只需使用 .array('name') 即可接收与名称相同字段的尽可能多的文件,还可以在客户端定义此 anme 作为参数,我正在使用相同的方法,如果仍有您有任何疑问,请随时发表评论:)

【讨论】:

【参考方案4】:

有点破解,但适用于 Multer v1.1.0:

multer().single("undefined")

【讨论】:

以上是关于使用 Multer 上传文件,而不知道它们的字段名的主要内容,如果未能解决你的问题,请参考以下文章

使用 Multer 将 csv 文件上传到 Node.js 时出现意外字段

上传文件时 Multer 出现意外的字段错误

通过表单从不同字段上传多个文件并使用express multer存储到mongodb数据库中

Node Multer 意外字段

使用 multer 上传的文件存储在云端后如何删除?

react上传图片文件到服务器——其他类似——multer修改后缀名后存储——返回静态资源