求教使用过formidable的Nodejs大神

求教使用过formidable的Nodejs大神

最近在做一个图片上传的项目,使用了formidable模块。官方的api上有个form.maxFieldsSize属性。 问题来了,看了源码,发现默认的最大上传的大小是210241024 ,也就是2M,但是我这边上传超过2M大小的也可以上传,form.maxFieldsSize重新设置 form.maxFieldsSize=110241024,发现也不起作用。不知道这个属性是用在哪里的?

4 回复

当然可以。让我们来详细探讨一下 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/');
});

解释

  1. 创建表单实例

    const form = new formidable.IncomingForm();
    
  2. 设置最大字段大小

    form.maxFieldsSize = 1 * 1024 * 1024; // 1MB
    

    这里我们设置最大字段大小为 1MB。

  3. 处理表单数据

    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 小。

确保你根据需要调整这些参数,以便正确地限制上传文件的大小。

回到顶部