javascript如何实现文件上传_FormData对象如何使用?


JavaScript文件上传核心是用FormData构建数据并用fetch或XMLHttpRequest发送,自动处理二进制、boundary和编码;需通过File/Blob添加文件,不可用路径;fetch不支持上传进度,需用XMLHttpRequest监听xhr.upload.onprogress。

JavaScript 实现文件上传,核心是用 FormData 构建表单数据,再配合 fetchXMLHttpRequest 发送到后端。它能自动处理文件二进制内容、边界(boundary)和编码,比手动拼接更可靠。

如何创建并填充 FormData 对象

FormData 可以从 HTML 表单元素直接生成,也可以手动创建后追加字段。文件必须通过 FileBlob 实例添加,不能用路径字符串。

  • 从表单创建(推荐):

    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(最常用)

调用 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));
  • 如需带认证或其它头(除 Content-Type 外),可以加:
    headers: { "Authorization": "Bearer xxx" } —— 但依然不要覆盖 Content-Type
  • 支持上传多个同名文件:
    for (let file of fileInput.files) {
    formData.append("photos", file); // 使用相同 key
    }
    ,后端收到的是文件数组

监听上传进度(仅 XMLHttpRequest 支持原生进度)

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 是下载进度

常见问题与注意事项

  • 文件没传过去? 检查 input 是否有 name 属性(表单方式),或 append 时 key 是否写错;后端接收字段名必须一致
  • 后端收不到文件? 确保后端接口支持 multipart/form-data 解析(如 Express 需 multer,Koa 需 @koa/multer
  • 大文件卡顿? 可结合分片上传或添加 loading 提示;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

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.