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

WordPress REST API无法上传8MB以上多媒体文件的解决方法

大文件上传WordPress媒体库失败修复方案

核心问题点

当前代码和配置存在3个会直接导致大文件上传失败/卡住的问题:

  1. 代码逻辑顺序错误:跳转语句header('Location: peticiones.php');被写在了cURL请求执行之前,脚本运行到这行就会输出跳转响应头,小文件传输速度快可能刚好在跳转触发前完成上传,100M级大文件传输耗时长,会被跳转逻辑直接中断。
  2. 配置修改不全:仅修改maximum_upload_file_size(实际PHP配置项名是upload_max_filesize)完全不够,多层服务都有大小/超时限制:
    • PHP层需要同步修改4个参数:post_max_size(值要大于单文件最大限制,建议设2500M)、max_execution_time(建议设300秒,给大文件传输留足执行时间)、max_input_time(建议设300秒,避免接收请求数据超时)、memory_limit(建议设2560M,避免读文件时内存溢出)
    • 如果用Nginx做Web服务或反向代理,必须添加client_max_body_size 2500M;配置,Nginx默认该值仅为1M/8M,请求到Nginx层就会被拦截,改完需要重载配置
    • 如果用PHP-FPM,需要同步修改request_terminate_timeout参数,值和max_execution_time保持一致,避免FPM进程提前被终止
  3. 上传实现方式不合理:用file_get_contents()把整个文件全部加载到内存再传给cURL,130M文件会直接占满对应内存,触发内存限制导致进程卡住;且手动写Content-Disposition头没有multipart格式的边界标识,大文件传输时WordPress端解析请求容易失败。

修正后可用代码

<?php
$archivo = "/var/www/Digital_Signage/formulario/".$_GET["ruta"];
// 提前校验文件可读性,避免无效请求卡进程
if (!file_exists($archivo) || !is_readable($archivo)) {
    die("待上传文件不存在或无读取权限");
}
$username = 'gpda';
$password = 'Pvry ZQ3N uypF 1AY6 876h yC8B';

$curl = curl_init();
// 用CURLFile让cURL直接读取文件流上传,不把整个文件加载进内存
$fileObj = new CURLFile($archivo, mime_content_type($archivo), basename($archivo));

curl_setopt_array($curl, array(
  CURLOPT_URL => "http://10.124.133.1:8182/wp-json/wp/v2/media/",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 300, // 超时时间拉长到5分钟适配大文件传输
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_HTTPHEADER => array(
    'Authorization: Basic ' . base64_encode($username . ':' . $password),
    "cache-control: no-cache",
  ),
  CURLOPT_POSTFIELDS => array('file' => $fileObj),
  CURLOPT_TCP_NODELAY => true, // 关闭Nagle算法减少大文件传输卡顿
));

$response = curl_exec($curl);
$err = curl_error($curl);
$httpStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);

// 所有上传逻辑处理完成后再执行跳转
if ($err) {
  echo "上传失败,cURL错误:" . $err;
} else if ($httpStatus != 201) { // WordPress媒体上传成功返回201状态码
  echo "上传失败,接口返回状态码".$httpStatus.",返回内容:".$response;
} else {
  header('Location: peticiones.php');
  exit; // 跳转后立刻终止脚本执行,避免多余输出
}
?>

验证步骤

  • 所有配置修改完成后,重启PHP-FPM、Nginx/Apache服务,确保配置生效
  • 先用10M左右文件测试上传逻辑正常,再逐步测试大文件
  • 如果仍有卡顿,可以临时加curl_setopt($curl, CURLOPT_VERBOSE, true);打印详细传输日志,定位具体卡点

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 13:09:16