前言
文件上传如果加上进度条会有更好的用户体验(尤其是中大型文件),本文使用 Nodejs
配合前端完成这个功能。
前端我们使用 FormData
来作为载体发送数据。
效果
前端部分
HTML 部分 和 Js 部分
<input type="file" id="file" /> <!-- 进度条 --> <progress id="progress" value="0" max="100"></progress> // 获取 input file 的 dom 对象 const inputFile = document.querySelector('#file'); // 监听 change 事件 inputFile.addEventListener('change', function() { // 使用 formData 装载 file const formData = new FormData(); formData.append('file', this.files[0]); // 上传文件 upload(formData); })
下面我们实现 upload 方法。
使用 XMLHttpRequest 的方式
const upload = ( formData ) => { const xhr = new XMLHttpRequest(); // 监听文件上传进度 xhr.upload.addEventListener('progress', function(e) { if (e.lengthComputable) { // 获取进度 const progress = Math.round((e.loaded * 100) / e.total); document.querySelector('#progress').setAttribute('value', progress); } },false); // 监听上传完成事件 xhr.addEventListener('load', ()=>{ console.log(':smile:上传完成') }, false); xhr.open('post', 'http://127.0.0.1:3000/upload'); xhr.send(formData); }
使用 jQuery 的 ajax 上传
jQuery 目前的使用量依然庞大,那么使用 jQuery 的 ajax 如何监听文件上传进度呢:
const upload = ( formData ) => { $.ajax({ type: 'post', url: 'http://127.0.0.1:3000/upload', data: formData, // 不进行数据处理和内容处理 processData: false, contentType: false, // 监听 xhr xhr: function() { const xhr = $.ajaxSettings.xhr(); if (xhr.upload) { xhr.upload.addEventListener('progress', e => { const { loaded, total } = e; var progress = (loaded / total) * 100; document.querySelector('#progress').setAttribute('value', progress); }, false ); return xhr; } }, success: function(response) { console.log('上传成功'); } }); }
使用 axios 上传并监听进度
axios 使用量非常大,用它监听文件上传更简单,代码如下:
const upload = async ( formData ) => { let config = { // 注意要把 contentType 设置为 multipart/form-data headers: { 'Content-Type': 'multipart/form-data' }, // 监听 onUploadProgress 事件 onUploadProgress: e => { const {loaded, total} = e; // 使用本地 progress 事件 if (e.lengthComputable) { let progress = loaded / total * 100; document.querySelector('#progress').setAttribute('value', progress); } } }; const { status } = await axios.post('http://127.0.0.1:3000/upload', formData, config); if (res.status === 200) { console.log('上传完成:grinning:'); } }
Nodejs 部分
这部分比较简单,其实就是单纯的文件上传,我们用 Koa 来实现.
环境搭建及依赖包安装
这里使用 koa2 ,安装以下依赖包:
- koa
- @koa/router: koa 的路由
- @koa/cors:用于跨域
- koa-body: 解析 body 数据
- nodemon: 使用它启动服务,带有热更新
代码部分
const Koa = require('koa'); const Router = require('@koa/router'); const koaBody = require('koa-body'); const path = require('path'); const fs = require('fs'); const cors = require('@koa/cors'); const app = new Koa(); const router = new Router(); router.all('/upload', async ctx => { // 处理文件上传 const res = await dealFile(ctx); res && (ctx.body = { status: 200, msg: 'complete' }); }); // 中间件部分 app.use(cors()); app.use( koaBody({ multipart: true, formidable: { maxFileSize: 2000 * 1024 * 1024 //最大2G } }) ); app.use(router.routes()); app.use(router.allowedMethods()); app.listen(3000);
dealFile 方法处理上传的文件
出于性能考虑,操作 file 毫无疑问要使用 stream 。
我们要监听文件流 end 事件,由于无法在事件回调里返回响应,因为会报 404,所以需要使用 Promise
来封装一下,然后用 async、await
const dealFile = ctx => { const { file } = ctx.request.files; const reader = fs.createReadStream(file.path); const writer = fs.createWriteStream( // 文件上传到 image 文件夹中 path.resolve(__dirname, './image', file.name) ); return new Promise((resove, reject) => { reader.pipe(writer); reader.on('end', () => { resove(true); }); reader.on('error', err => { throw err; }) }); };
到这里就全部完成了。
这里注意一下:前端监听文件进度不需要后端有什么特殊处理,后端仅仅是做了文件流的写入而已。
总结
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
2024年11月16日
2024年11月16日
- 2019明达发烧碟MasterSuperiorAudiophile[WAV+CUE]
- 蔡幸娟.1993-相爱容易相处难【飞碟】【WAV+CUE】
- 陆虎.2024-是否愿意成为我的全世界【Hikoon】【FLAC分轨】
- 关淑怡.2009-ERA【星娱乐】【WAV+CUE】
- 林忆莲《关于她的爱情故事》2022新世纪MQA 24K金碟限量版[WAV+CUE]
- 张雨生1993《一天到晚游泳的鱼》台湾G字首版[WAV+CUE][1G]
- 群星《试音五大女声》[WAV+CUE][1G]
- 魔兽世界wlk武器战一键输出宏是什么 wlk武器战一键输出宏介绍
- 魔兽世界wlk狂暴战一键输出宏是什么 wlk狂暴战一键输出宏介绍
- 魔兽世界wlk恶魔术士一键输出宏是什么 wlk恶魔术士一键输出宏介绍
- 医学爱好者狂喜:UP主把医学史做成了格斗游戏!
- PS5 Pro评分解禁!准备升级入手吗?
- 我们盘点了近期火热的国产单机游戏!《琉隐神渡》等 你期待哪款?
- 2019年第12届广州影音展双碟纪念版ADMS2CD[MP3/WAV]
- 黄安《救姻缘》台首版[WAV+CUE]