JavaScript文件上传核心是用FormData构建数据并用fetch或XMLHttpRequest发送,自动处理二进制、boundary和编码;需通过File/Blob添加文件,不可用路径;fetch不支持上传进度,需用XMLHttpRequest监听xhr.upload.onprogress。
JavaScript 实现文件上传,核心是用 FormData 构建表单数据,再配合 fetch 或 XMLHttpRequest 发送到后端。它能自动处理文件二进制内容、边界(boundary)和编码,比手动拼接更可靠。
FormData 可以从 HTML 表单元素直接生成,也可以手动创建后追加字段。文件必须通过 File 或 Blob 实例添加,不能用路径字符串。
const form = document.getElementById("uploadForm");
const formData = new FormData(form); // 自动包含所有带 name 的 input[type=file]const formData = new FormData();
const fileInput = document.querySelector('input[type="file"]');
if (fileInput.files.length > 0) {
formData.append("photo", fileInput.files[0]); // 第二个参数是 File 对象
}
formData.append("username", "alice");
formData.append("description", "My profile photo");调用 fetch 时,直接传入 FormData 实例即可。注意:不要设置 Content-Type 头,浏览器会自动设置为 multipart/form-data 并带上正确的 boundary。
fetch("/api/upload", {
method: "POST",
body: formData // 不要加 headers: { "Content-Type": ... }
r.json()).then(data => console.log(data));headers: { "Authorization": "Bearer xxx" } —— 但依然不要覆盖 Content-Typefor (let file of fileInput.files) {
formData.append("photos", file); // 使用相同 key
},后端收到的是文件数组fetch 目前不提供上传进度事件,如需显示进度条,得用 XMLHttpRequest:
const xhr = new XMLHttpRequest();
xhr.upload.onprogress = e => {
if (e.lengthComputable) {
console.log(`上传中:${(e.loaded / e.total * 100).toFixed(1)}%`);
}
};
xhr.open("POST", "/api/upload");
xhr.send(formData);
xhr.upload 是专门用于监听上传过程的对象,xhr.onprogress 是下载进度name 属性(表单方式),或 append 时 key 是否写错;后端接收字段名必须一致multipart/form-data 解析(如 Express 需 multer,Koa 需 @koa/multer)FormData 本身不压缩,体积等于原始文件URL.createObjectURL(file) 生成临时 URL,赋给 即可,无需上传
# javascript
# java
# html
# js
# json
# 编码
# 浏览器
# app
# 后端
# 常见问题
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Windows电脑键盘突然失灵怎么办?(驱动与硬件排查)
如何在Golang中处理云原生事件_使用Event和Notification机制
如何使用Golang实现RPC序列化与反序列化_Golang RPC数据编码与解码方法
Python安全爬虫设计_IP代理池与验证码识别策略解析
Linux怎么设置磁盘配额_Linux系统Quota安装与用户空间限制【教程】
php串口通信波特率怎么选_根据硬件手册设置正确波特率【方法】
php8.4如何实现队列任务_php8.4redis队列简单实现方法【教程】
Windows10蓝屏SYSTEM_SERVICE_EXCEPTION_Win10驱动冲突排查
Django 测试数据库表缺失与字段未创建问题的完整解决方案
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
Windows 11怎么更改锁屏超时时间_Windows 11电源选项中设置屏幕关闭时间
如何在Golang中实现邮件发送功能_Golang SMTP发送与错误处理示例
Win10怎么限制单程序CPU占用上限_Win10任务管理器亲和性或第三方工具均衡负载【技巧】
Win11怎样激活系统密钥_Win11系统密钥激活步骤【攻略】
如何在Golang中使用log包输出不同级别日志_Golang log日志管理与分类
Win11时间不对怎么同步_Win11自动校准互联网时间【设置】
Win11开机自检怎么关闭_跳过Win11开机磁盘扫描修复方法【技巧】
如何正确访问 Laravel 模型或对象的属性而非调用不存在的方法
用lighttpd能运行php吗_lighttpd配置php步骤【教程】
Windows的便笺功能如何使用?(桌面备忘技巧)
Windows系统被恶意软件破坏后的恢复策略_错误提示修复方式
如何使用Golang实现路由分组管理_Golang路由分组与权限控制方法
Win11怎么关闭自动修复_跳过Win11开机自动修复循环【技巧】
Windows执行文件被SmartScreen拦截原因_安全提示与绕过方式
如何在 ACF 中正确更新嵌套多层 Group 字段内的子字段
Win11怎么看电池循环次数_Win11笔记本电池寿命检测【命令】
Win10如何更改开机密码_Windows10登录选项更改密码
c++中的可变参数模板(variadic templates)怎么用_c++模板编程黑魔法【C++11】
C++中的constexpr和const有什么区别?(编译期常量)
c++如何获取map中所有的键_C++遍历键值对提取所有key的方法
Win11怎么退出微软账户_切换Win11为本地账户登录方法【详解】
Win11怎么关闭任务栏小图标_Windows11任务栏角溢出设置
mac怎么退出id_MAC退出iCloud账号与Apple ID切换【指南】
Win11怎么设置鼠标宏_Win11鼠标按键自定义编程教程【详解】
如何用正则与预处理结合精准拦截拼接式垃圾域名
如何使用Golang实现聊天室消息存档_存储聊天记录到文件
如何使用Golang实现微服务事件驱动_使用消息总线解耦服务
如何诊断并终止卡死的 multiprocessing 子进程
Win11声音忽大忽小怎么办 Win11音频增强功能关闭教程【修复】
Mac如何创建和管理多个桌面空间_Mac高效多任务处理【技巧】
Win10怎么卸载爱奇艺_Win10彻底卸载爱奇艺方法【步骤】
TestNG的testng.xml配置文件怎么写
Win11无法识别耳机怎么办_解决Win11插耳机没声音问题【步骤】
如何在 Go 中正确反序列化多个并列的 XML 元素(而非 XML 数组)
mac怎么打开终端_MAC终端Terminal使用入门与常用命令【教程】
如何使用Golang模拟请求超时_Golang context与HTTP请求测试实践
如何用列表一次性对 DataFrame 的指定列应用字典映射
VSC怎样用终端运行PHP_命令行执行脚本的步骤【教程】
Win11玩游戏全屏闪退怎么办_Win11全屏优化禁用设置【教程】
Python字符串操作教程_切片拼接与格式化详解
2025-12-18
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。