html5怎么嵌入文件上传_html5嵌入上传进度显示【步骤】
发布时间 - 2026-01-28 00:00:00 点击率:次HTML5文件上传需用选文件,进度显示必须通过XMLHttpRequest监听upload.onprogress事件实现,fetch不直接支持;关键要检查event.lengthComputable,且服务端须正确返回Content-Length响应头。
HTML5 文件上传用 就够了,但进度显示必须靠 JavaScript
纯 HTML5 标签本身不提供上传进度反馈。进度条依赖 XMLHttpRequest 或 fetch 配合 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两种方式)


