如何使用 Ajax 无表单提交上传文件(支持多图)

发布时间 - 2026-02-02 00:00:00    点击率:

本文详解如何在不依赖 `

` 标签和传统 submit 行为的前提下,通过原生 `formdata` 和 jquery ajax 正确上传文件(如图片),重点解决 `filelist` 对象误传导致后端无法解析的问题。

在前端文件上传场景中,许多开发者尝试绕过

提交,改用按钮触发 Ajax 上传,但常因对 input[type="file"].files 属性理解偏差而失败——例如直接将 FileList 对象(如 forminput[0].files)作为整体 append() 到 FormData 中,结果后端接收到的却是 [object FileList] 字符串,而非实际文件数据。

根本原因在于:FormData.append() 不支持直接传入 FileList 对象。它仅接受单个 File 或 Blob 实例。input.files 返回的是只读的 FileList 类数组对象,需显式遍历其中每个 File 项,逐个追加:

for (let i = 0; i < forminput[0].files.length; i++) {
  form_data.append('images[]', forminput[0].files[i]);
}

此外,还需确保 Ajax 配置正确:

  • processData: false:禁止 jQuery 自动序列化数据(否则会破坏二进制文件流);
  • contentType: false:让浏览器自动设置 multipart/form-data 及边界(boundary),并携带正确的 Content-Type 头;
  • cache: false:避免 IE 等浏览器缓存 GET 请求(虽此处为 POST,但属良好实践)。

完整修正后的 JavaScript 代码如下:

$('.formimgaj').each(function() {
  const fileInput = $( ".form-control-file", this )[0]; // 获取原生 DOM 元素
  $(this).find(".butt_img_upload").on('click', function(e) {
    e.preventDefault();

    if (!fileInput.files || fileInput.files.length === 0) {
      console.warn('未选择任何文件');
      return;
    }

    const formData = new FormData();
    // ✅ 关键:遍历 FileList,逐个 append 单个 File
    for (let i = 0; i < fileInput.files.length; i++) {
      formData.append('images[]', fileInput.files[i]);
    }
    formData.append('type', 'updateimg');

    $.ajax({
      type: 'POST',
      url: 'php/update.php',
      data: formData,
      processData: false,
      contentType: false,
      cache: false,
      success: function(response) {
        console.log('上传成功:', response);
      },
      error: function(xhr, status, err) {
        console.error('上传失败:', status, err);
      }
    });
  });
});

⚠️ 注意事项:

  • HTML

    中 enctype="multipart/form-data" 仅对 标签有效,放在 div 上无效,可安全移除;
  • 若需支持多选(multiple),请为 添加 multiple 属性;
  • 后端 PHP 接收时,$_FILES['images'] 将是标准多维数组结构(含 name、tmp_name、size 等),可直接循环处理:
    foreach ($_FILES['images']['tmp_name'] as $key => $tmp_name) {
        if (is_uploaded_file($tmp_name)) {
            move_uploaded_file($tmp_name, "uploads/{$_FILES['images']['name'][$key]}");
        }
    }

掌握 FileList 的遍历本质与 FormData 的接口约束,是实现无表单 Ajax 文件上传的关键一步。


# php  # javascript  # java  # jquery  # html  # 前端  # ajax  # 浏览器  # app  # 后端  # 表单提交  # Object  # 多维数组  # 字符串  # 循环  # 接口  # append  # 对象  # input  # 遍历  # 上传  # 多维  # 文件上传  # 的是  # 放在  # 却是  # 将是  # 不支持 


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


相关推荐: 网站制作软件免费下载安装,有哪些免费下载的软件网站?  Laravel如何使用Livewire构建动态组件?(入门代码)  清除minerd进程的简单方法  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  如何用低价快速搭建高质量网站?  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  香港服务器选型指南:免备案配置与高效建站方案解析  如何获取PHP WAP自助建站系统源码?  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  如何在搬瓦工VPS快速搭建网站?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何在景安服务器上快速搭建个人网站?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  香港服务器部署网站为何提示未备案?  电商网站制作价格怎么算,网上拍卖流程以及规则?  如何快速使用云服务器搭建个人网站?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  Laravel如何处理表单验证?(Requests代码示例)  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  如何在VPS电脑上快速搭建网站?  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  Java遍历集合的三种方式  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  微信小程序 五星评分(包括半颗星评分)实例代码  如何快速搭建高效WAP手机网站?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  详解Android图表 MPAndroidChart折线图  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  如何在阿里云域名上完成建站全流程?  详解CentOS6.5 安装 MySQL5.1.71的方法  网易LOFTER官网链接 老福特网页版登录地址  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  b2c电商网站制作流程,b2c水平综合的电商平台?  如何在景安云服务器上绑定域名并配置虚拟主机?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  如何在阿里云ECS服务器部署织梦CMS网站?  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  java中使用zxing批量生成二维码立牌  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  php json中文编码为null的解决办法  简历没回改:利用AI润色让你的文字更专业  Laravel怎么使用artisan命令缓存配置和视图