html5怎么嵌入文件上传_html5嵌入上传进度显示【步骤】

发布时间 - 2026-01-28 00:00:00    点击率:
HTML5文件上传需用选文件,进度显示必须通过XMLHttpRequest监听upload.onprogress事件实现,fetch不直接支持;关键要检查event.lengthComputable,且服务端须正确返回Content-Length响应头。

HTML5 文件上传用 就够了,但进度显示必须靠 JavaScript

纯 HTML5 标签本身不提供上传进度反馈。进度条依赖 XMLHttpRequestfetch 配合 upload.onprogress 事件, 只负责选文件。

  • 别指望给 加个属性就能出进度——没有这种属性
  • 必须监听 XMLHttpRequest.upload.onprogress,不是 request.onprogress
  • fetch 不直接支持上传进度,需配合 ReadableStream 分块读取 + AbortController 手动模拟,复杂度高,推荐用 XMLHttpRequest

XMLHttpRequest 实现带进度的上传

核心是创建实例、监听 upload.onprogress、手动发送 FormData

const input = document.querySelector('input[type="file"]');
input.addEventListener('change', (e) => {
  const file = e.target.files[0];
  if (!file) return;

const xhr = new XMLHttpRequest(); xhr.open('POST', '/upload');

// 关键:监听 upload 对象,不是 xhr 本身 xhr.upload.onprogress = (event) => { if (event.lengthComputable) { const percent = (event.loaded / event.total) * 100; console.log(上传中:${percent.toFixed(1)}%); // 更新进度条 DOM,例如:document.getElementById('bar').style.width = ${percent}%; } };

xhr.onload = () => { if (xhr.status === 200) { console.log('上传完成'); } };

const formData = new FormData(); formData.append('file', file); xhr.send(formData); });

  • 务必检查 event.lengthComputable,否则 event.total 可能为 0(如服务端未返回 Content-Length
  • 后端需正确响应,至少返回 200 OK,且不能关闭连接过早
  • 若后端用 multipart 解析(如 Express 的 multer),确保字段名(这里是 'file')和服务

    端配置一致

常见失败原因:进度始终为 0% 或不触发 onprogress

这不是前端代码写错了,大概率是环境或服务端问题:

  • 本地 file:// 协议下,XMLHttpRequest 可能被浏览器限制,务必跑在 http://https://
  • 服务端没返回 Content-Length 响应头(尤其代理层如 Nginx 默认不透传),导致 event.lengthComputable === false
  • 使用了 axios 等封装库却没开启 onUploadProgress 选项,或误用了 onDownloadProgress
  • 文件过大触发了浏览器内存限制,部分 Chrome 版本对超大文件的 onprogress 触发不规律

移动端和 Safari 的兼容注意点

iOS Safari 15.4+ 才完整支持 upload.onprogress,旧版可能完全静默;Android WebView 行为也不统一:

  • 不要依赖 event.total 计算百分比,可改用“已发送 chunk 数 / 预估总 chunk 数”做粗略估算(需分片上传)
  • 避免在 onprogress 中频繁操作 DOM,iOS 上容易卡顿,建议用 requestIdleCallback 节流更新
  • 如果必须支持老 Safari,考虑降级为“上传中…(无数字)”,或改用 WebKit-only 的 webkitRelativePath 辅助判断是否开始上传

实际嵌入时,最易被忽略的是服务端是否真正支持并透传上传长度信息——前端写得再标准,Nginx 没配 proxy_buffering off 或后端框架吞掉了 Content-Length,进度条就永远停在 0%。


# javascript  # java  # html  # android  # 前端  # html5  # nginx  # 浏览器  # app  # axios  # chrome  # safari  # webkit  # express  # 封装  # Length  # Event  # 事件  # dom  # input  # ios  # webview  # http  # https  # 上传  # 服务端  # 选文  # 后端  # 进度条  # 不直接  # 文件上传  # 的是  # 也不  # 就能 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  如何利用DOS批处理实现定时关机操作详解  三星网站视频制作教程下载,三星w23网页如何全屏?  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  如何在万网主机上快速搭建网站?  JS经典正则表达式笔试题汇总  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  音乐网站服务器如何优化API响应速度?  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  如何做网站制作流程,*游戏网站怎么搭建?  Windows Hello人脸识别突然无法使用  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  如何在服务器上三步完成建站并提升流量?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  高端建站如何打造兼具美学与转化的品牌官网?  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  如何在宝塔面板中创建新站点?  java获取注册ip实例  使用spring连接及操作mongodb3.0实例  如何快速登录WAP自助建站平台?  如何在香港免费服务器上快速搭建网站?  如何确保西部建站助手FTP传输的安全性?  如何在IIS管理器中快速创建并配置网站?  如何快速搭建支持数据库操作的智能建站平台?  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  Laravel如何与Inertia.js和Vue/React构建现代单页应用  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  网站制作软件有哪些,制图软件有哪些?  公司门户网站制作流程,华为官网怎么做?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  Laravel如何使用Sanctum进行API认证?(SPA实战)  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  如何在云指建站中生成FTP站点?  如何撰写建站申请书?关键要点有哪些?  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  如何在 React 中条件性地遍历数组并渲染元素  如何安全更换建站之星模板并保留数据?  JavaScript如何实现继承_有哪些常用方法  Laravel怎么在Blade中安全地输出原始HTML内容  Laravel如何使用查询构建器?(Query Builder高级用法)  phpredis提高消息队列的实时性方法(推荐)  Laravel如何创建自定义Facades?(详细步骤)  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)