在 web 开发中,文件上传是一个常见的需求,而文件上传进度条则是提高用户体验的重要元素之一。本文将介绍如何在 Koa 中优雅地实现文件上传进度条。
1. 原理
文件上传进度条的实现原理是通过监听上传数据流的进度,然后将进度信息返回给前端。在 Koa 中,我们可以通过监听 req
对象的 data
和 end
事件来实现这个功能。
2. 实现步骤
2.1 安装依赖
我们需要安装 koa-body
和 formidable
两个依赖来处理文件上传和解析表单数据。
npm install koa-body formidable
2.2 创建上传路由
首先,我们需要创建一个上传文件的路由。在路由中,我们使用 koa-body
中间件来处理上传的文件和表单数据。
// javascriptcn.com 代码示例 const Koa = require('koa'); const koaBody = require('koa-body'); const app = new Koa(); app.use(koaBody()); app.use(async (ctx) => { // 处理上传的文件和表单数据 });
2.3 监听上传进度
在 koa-body
中间件处理完上传数据后,我们可以获取到上传文件的信息。我们需要使用 formidable
来解析上传的文件,并监听上传数据流的进度。
// javascriptcn.com 代码示例 const Koa = require('koa'); const koaBody = require('koa-body'); const formidable = require('formidable'); const app = new Koa(); app.use(koaBody()); app.use(async (ctx) => { const form = formidable({ multiples: true }); form.on('progress', (bytesReceived, bytesExpected) => { const percent = Math.floor(bytesReceived / bytesExpected * 100); console.log(`上传进度:${percent}%`); }); try { const { fields, files } = await new Promise((resolve, reject) => { form.parse(ctx.req, (err, fields, files) => { if (err) { reject(err); } else { resolve({ fields, files }); } }); }); console.log('表单数据:', fields); console.log('上传文件:', files); } catch (err) { console.error(err); } });
在 form.on('progress')
回调函数中,我们可以获取到上传数据流的已接收字节数 bytesReceived
和总字节数 bytesExpected
,然后计算出上传进度百分比 percent
。在实际应用中,我们可以将上传进度信息返回给前端,以实现文件上传进度条的效果。
3. 示例代码
下面是一个完整的文件上传进度条示例代码。
// javascriptcn.com 代码示例 const Koa = require('koa'); const koaBody = require('koa-body'); const formidable = require('formidable'); const app = new Koa(); app.use(koaBody()); app.use(async (ctx) => { const form = formidable({ multiples: true }); form.on('progress', (bytesReceived, bytesExpected) => { const percent = Math.floor(bytesReceived / bytesExpected * 100); console.log(`上传进度:${percent}%`); ctx.response.body = { progress: percent }; }); try { const { fields, files } = await new Promise((resolve, reject) => { form.parse(ctx.req, (err, fields, files) => { if (err) { reject(err); } else { resolve({ fields, files }); } }); }); console.log('表单数据:', fields); console.log('上传文件:', files); ctx.response.body = { success: true }; } catch (err) { console.error(err); ctx.response.body = { success: false }; } }); app.listen(3000); console.log('Server is running at http://localhost:3000');
4. 总结
本文介绍了如何在 Koa 中实现文件上传进度条的方法。通过监听上传数据流的进度,我们可以实时获取上传进度信息,并将其返回给前端,以提高用户体验。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/655f7752d2f5e1655d9b0718