Nodejs中关于formidable的progress事件

Nodejs中关于formidable的progress事件

app.post(’/uploadFile’,function(req,res){ var form = new formidable.IncomingForm(),randomId,searchForm; var count = 0; randomId = req.body.randomId; searchForm = searchQueueById.searchFormQueueById(randomId,globalForm); if(searchForm){ searchForm.on(‘progress’,function(bytesReceived,bytesExpected,ending){ count++; if(count%50 === 0){ res.send({bytesReceived:bytesReceived,bytesExpected:bytesExpected,ending:ending,flag:true}); }else{ res.send({flag:false,ending:ending}); } }); }else{ res.send({flag:true}); } }); 首先iframe上传提交,我用ajax定时去取文件内容,为什么我这个progress事件没有执行。


3 回复

当然可以。让我们详细讨论一下 formidable 库中的 progress 事件,并解释为什么你在当前实现中可能无法看到 progress 事件的触发。

关于 formidableprogress 事件

formidable 是一个用于解析 HTTP 请求(特别是文件上传)的 Node.js 模块。progress 事件允许你监听文件上传过程中的进度。当你需要实时地获取文件上传的状态时,这个事件非常有用。

示例代码与解释

假设我们有一个简单的文件上传接口 /uploadFile,我们将使用 formidable 来处理文件上传,并通过 progress 事件来报告上传进度。

const http = require('http');
const formidable = require('formidable');

http.createServer((req, res) => {
    if (req.url === '/uploadFile' && req.method.toLowerCase() === 'post') {
        // 创建一个新的 IncomingForm 对象
        const form = new formidable.IncomingForm();
        
        // 设置最大文件大小为 10MB
        form.maxFileSize = 10 * 1024 * 1024; 

        // 监听 progress 事件
        form.on('progress', (bytesReceived, bytesExpected) => {
            console.log(`Received ${bytesReceived} of ${bytesExpected} bytes`);
            
            // 如果你想发送进度信息给客户端,你可以在这里发送一个响应
            res.write(`Progress: ${Math.round((bytesReceived / bytesExpected) * 100)}%\n`);
        });

        // 解析请求
        form.parse(req, (err, fields, files) => {
            if (err) {
                res.writeHead(500);
                res.end('Error occurred');
                return;
            }

            res.writeHead(200, { 'Content-Type': 'text/plain' });
            res.end('Upload completed successfully!');
        });
    } else {
        res.writeHead(404, { 'Content-Type': 'text/plain' });
        res.end('Not found');
    }
}).listen(3000, () => {
    console.log('Server listening on port 3000');
});

问题分析

在你的原始代码片段中,你似乎试图在一个已存在的 searchForm 对象上绑定 progress 事件。然而,searchForm 并不是一个有效的 IncomingForm 对象实例,因此 progress 事件不会被触发。

正确的做法是在创建的 form 实例上绑定 progress 事件,如上述示例所示。这样,每当有新的文件数据被接收时,progress 事件就会被触发。

希望这能帮助你理解如何正确使用 formidableprogress 事件来监控文件上传的进度。


可以用socket的emit方法,很简单

req.form.on('progress',function(r,e){
    var per = ((r/e)*100)+"%";
    socket.emit('getper',per);
});

在使用 formidable 处理文件上传时,progress 事件用于报告上传进度。你的问题可能是由于 progress 事件绑定的时机不对,或者是在错误的地方绑定。

以下是一个修正后的示例代码,展示了如何正确处理 progress 事件,并通过 AJAX 定期查询上传进度:

const formidable = require('formidable');
const http = require('http');

http.createServer((req, res) => {
    if (req.url === '/uploadFile' && req.method.toLowerCase() === 'post') {
        const form = new formidable.IncomingForm();
        
        form.on('progress', (bytesReceived, bytesExpected) => {
            console.log(`Received ${bytesReceived} of ${bytesExpected}`);
        });

        form.parse(req, (err, fields, files) => {
            if (err) {
                res.writeHead(500, { 'Content-Type': 'text/plain' });
                res.end('Internal Server Error');
                return;
            }

            res.writeHead(200, { 'Content-Type': 'application/json' });
            res.end(JSON.stringify({
                message: 'Upload successful',
                fields,
                files
            }));
        });
    } else {
        res.writeHead(404, { 'Content-Type': 'text/plain' });
        res.end('Not Found');
    }
}).listen(3000, () => {
    console.log('Server running at http://127.0.0.1:3000/');
});

解释:

  1. 创建表单对象const form = new formidable.IncomingForm();
  2. 监听进度事件form.on('progress', (bytesReceived, bytesExpected) => {...});
  3. 解析请求并处理文件form.parse(req, (err, fields, files) => {...});
  4. 返回响应:根据上传结果返回相应的 JSON 响应。

确保客户端(例如通过 AJAX)定期发送请求来检查上传状态,而不是依赖于服务器端的 progress 事件来直接响应。

回到顶部