You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress多文件输入框AJAX上传报400错误求助

WordPress AJAX多文件上传400错误排查与修复

400错误(Bad Request)在WordPress AJAX上传场景中,大多和安全验证、路径配置、钩子缺失有关,结合你的代码,问题主要集中在以下几点:

一、核心问题排查

1. Nonce验证失败(最常见原因)

你代码里用到了nonce,但必须确保:

  • 页面中正确输出nonce字段,生成代码应为:
    <input type="hidden" id="file_upload_nonce" value="<?php echo wp_create_nonce('file_upload'); ?>">
    
    要保证wp_create_nonce的参数'file_upload'和PHP验证时wp_verify_nonce的第二个参数完全一致。
  • 如果是前端未登录用户操作,当前仅添加的wp_ajax_file_upload钩子只对登录用户生效,必须补充未登录用户的钩子:
    add_action('wp_ajax_nopriv_file_upload','file_upload');
    

2. AJAX URL路径错误

硬编码/wp-admin/admin-ajax.php在子目录部署的WordPress站点会失效,应该用WordPress内置函数输出正确路径:
如果JS是内嵌在PHP模板中:

url: '<?php echo admin_url('admin-ajax.php'); ?>',

如果JS是单独的外部文件,需要先通过wp_localize_script传递URL到前端:

wp_localize_script('your-script-handle', 'ajax_obj', array(
    'ajax_url' => admin_url('admin-ajax.php')
));

之后JS里用ajax_obj.ajax_url作为请求地址。

3. 上传目录配置错误

PHP中/wp-content/supporting-evidence/是服务器根目录的绝对路径,大概率不存在或权限不足,应该用WordPress常量构建路径,并且确保目录存在:

$upload_dir = WP_CONTENT_DIR . '/supporting-evidence/' . $application_id . '/';
// 自动创建目录并处理权限
if (!wp_mkdir_p($upload_dir)) {
    echo '目录创建失败,请检查权限';
    wp_die();
}

二、修正后的完整代码

前端JS代码

$(document).on('change','input[type="file"]',function(){
  var fd = new FormData();
  // 直接循环当前input的files,无需额外嵌套循环
  $.each(this.files, function(j, file){
      fd.append('files[]', file); // 用files[]格式,PHP会自动识别为数组
  });

  fd.append('action', 'file_upload');
  fd.append('nonce', $('#file_upload_nonce').val());
  fd.append('application_id', $(this).closest('.application_question').data('application-id'));

  $.ajax({
      type: 'POST',
      url: ajax_obj.ajax_url, // 用本地化的URL
      data: fd,
      contentType: false,
      processData: false,
      success: function(response){
        console.log(response);
      },
      error: function(xhr){
        console.log('错误状态:' + xhr.status + ',响应:' + xhr.responseText);
      }
  });
});

后端PHP代码

function file_upload(){
  // 先检查请求方法
  if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    echo '非法请求方法';
    wp_die();
  }

  // Nonce验证
  if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( $_POST['nonce'], 'file_upload' ) ) {
    echo '安全验证失败';
    wp_die();
  }

  // 检查application_id是否存在
  if (!isset($_POST['application_id']) || empty($_POST['application_id'])) {
    echo '缺少应用ID参数';
    wp_die();
  }

  $application_id = sanitize_text_field($_POST['application_id']);
  $upload_dir = WP_CONTENT_DIR . '/supporting-evidence/' . $application_id . '/';

  // 创建目录
  if (!wp_mkdir_p($upload_dir)) {
    echo '上传目录创建失败,请检查服务器权限';
    wp_die();
  }

  // 处理多文件上传
  if (!isset($_FILES['files']) || empty($_FILES['files']['name'][0])) {
    echo '未选择文件';
    wp_die();
  }

  foreach ($_FILES['files']['name'] as $f => $name) {
    // 跳过错误的文件
    if ($_FILES['files']['error'][$f] !== UPLOAD_ERR_OK) {
      echo '文件' . $name . '上传错误,错误码:' . $_FILES['files']['error'][$f];
      continue;
    }

    $file_tmp = $_FILES['files']['tmp_name'][$f];
    $file_name = sanitize_file_name($name); // 清理文件名,避免特殊字符
    $file_path = $upload_dir . $file_name;

    if (move_uploaded_file($file_tmp, $file_path)) {
      echo '文件' . $file_name . '上传成功';
    } else {
      echo '文件' . $file_name . '上传失败';
    }
  }

  wp_die();
}
// 登录用户和未登录用户都能访问
add_action('wp_ajax_file_upload','file_upload');
add_action('wp_ajax_nopriv_file_upload','file_upload');

三、额外检查项

  • 确保PHP的upload_max_filesize和post_max_size配置足够大,避免大文件上传被拦截。
  • 检查服务器的上传目录权限,确保wp-content/supporting-evidence/目录有写入权限(一般设置为755或775,根据服务器配置调整)。
  • 打开浏览器控制台的Network面板,查看AJAX请求的具体响应内容,400错误的响应里通常会有更详细的提示。

内容的提问来源于stack exchange,提问作者AJT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:20:33