求教使用过formidable的Nodejs大神
求教使用过formidable的Nodejs大神
最近在做一个图片上传的项目,使用了formidable模块。官方的api上有个form.maxFieldsSize属性。 问题来了,看了源码,发现默认的最大上传的大小是210241024 ,也就是2M,但是我这边上传超过2M大小的也可以上传,form.maxFieldsSize重新设置 form.maxFieldsSize=110241024,发现也不起作用。不知道这个属性是用在哪里的?
当然可以。让我们来详细探讨一下 formidable
模块中的 maxFieldsSize
属性以及如何正确配置它。
问题分析
formidable
是一个非常流行的 Node.js 文件上传库,用于处理 multipart/form-data 类型的数据。maxFieldsSize
属性是用来限制所有字段(包括文件)的总大小的。然而,你可能遇到了一些困惑,因为即使设置了这个属性,仍然可以上传大于限制的文件。
示例代码
首先,让我们来看一下如何正确地使用 formidable
并设置 maxFieldsSize
属性。
const http = require('http');
const formidable = require('formidable');
http.createServer((req, res) => {
if (req.url === '/upload' && req.method.toLowerCase() === 'post') {
// 创建一个 formidable 表单实例
const form = new formidable.IncomingForm();
// 设置最大字段大小为 1MB
form.maxFieldsSize = 1 * 1024 * 1024; // 1MB
// 处理表单数据
form.parse(req, (err, fields, files) => {
if (err) {
console.error(err);
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end('Internal Server Error');
return;
}
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('File uploaded successfully!');
});
} else {
// 发送 HTML 表单以进行测试
res.writeHead(200, { 'Content-Type': 'text/html' });
res.end(`
<form action="/upload" enctype="multipart/form-data" method="post">
<input type="file" name="upload" />
<input type="submit" value="Upload" />
</form>
`);
}
}).listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
解释
-
创建表单实例:
const form = new formidable.IncomingForm();
-
设置最大字段大小:
form.maxFieldsSize = 1 * 1024 * 1024; // 1MB
这里我们设置最大字段大小为 1MB。
-
处理表单数据:
form.parse(req, (err, fields, files) => { if (err) { console.error(err); res.writeHead(500, { 'Content-Type': 'text/plain' }); res.end('Internal Server Error'); return; } res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('File uploaded successfully!'); });
常见问题
-
为什么设置
maxFieldsSize
不起作用?maxFieldsSize
限制的是所有字段(包括文件)的总大小。如果你只上传一个文件,那么这个限制实际上不会生效。你需要检查其他限制,例如maxFileSize
。
-
如何限制单个文件的大小?
- 使用
form.maxFileSize
来限制单个文件的大小。
form.maxFileSize = 1 * 1024 * 1024; // 1MB
- 使用
希望这些信息对你有帮助!如果你还有其他问题,欢迎继续提问。
https://github.com/andrewrk/node-multiparty/
直接支持文件的大小限制上传…源自formidable 但是改进了不少…
formidable
是一个用于处理 multipart/form-data
的 Node.js 模块,通常用于文件上传。form.maxFieldsSize
属性是用来限制单个字段(field)的最大大小,而不是整个请求体(body)的大小。
如果你想要限制上传文件的大小,应该使用 form.maxFileSize
属性来控制最大文件大小,而不是 form.maxFieldsSize
。下面是示例代码:
const http = require('http');
const formidable = require('formidable');
http.createServer((req, res) => {
if (req.url === '/upload' && req.method.toLowerCase() === 'post') {
const form = new formidable.IncomingForm();
// 设置最大文件大小为10MB
form.maxFileSize = 10 * 1024 * 1024; // 10MB
// 设置最大字段大小(单个字段)
form.maxFieldsSize = 2 * 1024 * 1024; // 2MB
form.parse(req, (err, fields, files) => {
if (err) {
res.writeHead(400, { 'Content-Type': 'text/html' });
res.end('上传失败');
return;
}
res.writeHead(200, { 'Content-Type': 'text/html' });
res.end('上传成功');
});
} else {
res.writeHead(200, { 'Content-Type': 'text/html' });
res.end(`
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<button type="submit">上传</button>
</form>
`);
}
}).listen(3000, () => {
console.log('服务器已启动,在端口3000上监听');
});
在这个例子中:
form.maxFileSize
控制了允许上传的最大文件大小(本例中设置为10MB)。form.maxFieldsSize
控制了每个字段的最大大小(本例中设置为2MB),但通常这个值比maxFileSize
小。
确保你根据需要调整这些参数,以便正确地限制上传文件的大小。