0

0

JavaScript如何实现文件上传_有哪些进度监控方法

夜晨

夜晨

发布时间:2025-12-24 21:42:36

|

587人浏览过

|

来源于php中文网

原创

JavaScript文件上传主要用XMLHttpRequest(支持原生进度监听)或fetch(需ReadableStream手动分块模拟进度);大文件推荐分片上传以实现断点续传与精细进度控制;UI上需节流更新、提供暂停/恢复及明确错误提示。

javascript如何实现文件上传_有哪些进度监控方法

JavaScript 实现文件上传主要依赖 XMLHttpRequest 或更现代的 fetch API,配合 FormData 构造请求体;进度监控则需利用 XMLHttpRequest.upload.onprogress 事件,fetch 原生不支持上传进度,需借助 ReadableStream + TransformStream 手动分块读取并上报进度。

使用 XMLHttpRequest 实现带进度的文件上传

这是最成熟、兼容性好且原生支持上传进度监听的方式。核心是绑定 upload.onprogress 事件,并在回调中计算已上传字节数与总大小的比例。

  • 创建 FormData 实例,用 append() 添加文件(如 formData.append('file', input.files[0])
  • 新建 XMLHttpRequest,设置 onloadonerror 处理响应
  • 关键步骤:获取 xhr.upload 对象,监听 onprogress,从事件对象的 loadedtotal 属性读取进度数据
  • 注意:若服务端未返回 Content-Length 或启用了 chunked transfer encoding,event.total 可能为 0,此时无法计算精确百分比,只能显示“上传中…”

使用 fetch + ReadableStream 模拟上传进度(现代方案)

fetch 本身不暴露上传过程,但可通过将文件转为 ReadableStream,手动分块读取并逐块发送,同时更新进度状态。

  • 调用 file.stream() 获取流,用 getReader() 创建读取器
  • 循环 reader.read() 获取 Uint8Array 块,拼接为完整二进制或直接通过 fetchbody 发送(需服务端支持流式接收)
  • 每次读取后更新已读字节数,触发自定义进度回调
  • 实际项目中常借助库如 form-data-encoder 或自行构造 multipart boundary,确保兼容传统表单上传格式

处理大文件分片上传(提升稳定性与可控性)

单次上传大文件易因网络中断失败,分片上传可断点续传、并发控制、独立校验,也天然支持粒度更细的进度反馈。

雾象
雾象

WaytoAGI推出的AI动画生成引擎

下载

立即学习Java免费学习笔记(深入)”;

  • 前端按固定大小(如 2MB)切分文件,用 file.slice(start, end) 提取 Blob
  • 为每片生成唯一标识(如文件 hash + 片序号),上传时携带分片索引、总片数、hash 等元信息
  • 维护一个上传队列,用 Promise.all 或串行方式控制并发;每片上传成功后更新整体进度(如 Math.round((uploadedChunks / totalChunks) * 100)
  • 服务端收到所有分片后合并,并校验最终文件 hash,返回完成结果

UI 层进度反馈与用户体验优化

进度条只是表象,真正影响体验的是响应及时性、错误提示和用户可控性。

  • 避免只依赖 onprogress 频繁更新 DOM,可用 requestAnimationFrame 节流或每 500ms 更新一次
  • 上传开始后禁用提交按钮,添加“暂停/恢复”按钮(分片场景下较易实现)
  • timeoutnetwork error4xx/5xx 做差异化提示,例如 “网络超时,请重试” 或 “文件类型不支持”
  • 上传完成后,展示缩略图(图片)、文件名+大小、下载链接等,形成闭环

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

492

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.10.25

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

954

2023.09.19

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

349

2023.10.25

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

1080

2023.11.14

python中append的含义
python中append的含义

本专题整合了python中append的相关内容,阅读专题下面的文章了解更多详细内容。

186

2025.09.12

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

4340

2024.08.14

promise的用法
promise的用法

“promise” 是一种用于处理异步操作的编程概念,它可以用来表示一个异步操作的最终结果。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。Promise的用法主要包括构造函数、实例方法(then、catch、finally)和状态转换。

337

2023.10.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号