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事件没有执行。
当然可以。让我们详细讨论一下 formidable
库中的 progress
事件,并解释为什么你在当前实现中可能无法看到 progress
事件的触发。
关于 formidable
的 progress
事件
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
事件就会被触发。
希望这能帮助你理解如何正确使用 formidable
的 progress
事件来监控文件上传的进度。
可以用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/');
});
解释:
- 创建表单对象:
const form = new formidable.IncomingForm();
- 监听进度事件:
form.on('progress', (bytesReceived, bytesExpected) => {...});
- 解析请求并处理文件:
form.parse(req, (err, fields, files) => {...});
- 返回响应:根据上传结果返回相应的 JSON 响应。
确保客户端(例如通过 AJAX)定期发送请求来检查上传状态,而不是依赖于服务器端的 progress
事件来直接响应。