使用 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 时出现意外字段