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

EC2部署WordPress插件curl报错26 curl_file_create触发500问题

问题根因

curl错误码26对应CURLE_READ_ERROR,即cURL读取本地资源时触发IO错误,这个问题和EC2权限配置没有直接关系,核心是代码对curl_file_create()的用法完全错误。
两个核心认知误区:

  1. curl_file_create()的第一个参数必须传入服务器本地可访问的文件绝对路径,不支持直接传入文件二进制字节流。你把$_REQUEST["image"]拿到的字节流当路径传进去,cURL会把这段二进制内容当成磁盘路径去找文件,自然读不到,直接报26错误。
  2. 你echo $cFile返回500错误是PHP基础机制导致的:curl_file_create()返回的是CURLFile类的实例,不是字符串,这个类没有实现__toString()魔术方法,强行echo对象会直接触发E_ERROR级别的致命错误,和环境、权限都没关系。
    你本地环境没复现,大概率是本地PHP配置的错误等级比较宽松,把相关致命警告/错误给屏蔽了,本质代码逻辑不符合cURL扩展的参数要求,不是环境偶发问题。
修复&排查步骤
  • 修正参数来源逻辑
    HTTP POST协议上传的文件默认不会存入$_REQUEST/$_POST数组,规范的文件上传会存在$_FILES超全局数组中。你能从$_REQUEST["image"]读到完整字节流,说明当前插件的上传逻辑是直接把文件二进制内容塞进了POST参数,没有在服务端生成落地的临时文件,这也是你调用cURL文件上传失败的核心前提问题。
  • 先把字节流落地为本地临时文件,再构造CURLFile对象
    如果你拿到的确实是图片原始二进制流,先把内容写入服务端可读写的临时文件,再拿文件绝对路径构造CURLFile对象,参考代码:
    // 读取传入的图片二进制流
    $imageBinary = $_REQUEST["image"];
    // 生成系统临时目录下的唯一临时文件,默认web运行用户对系统临时目录有读写权限,不需要额外改权限
    $tmpFile = tempnam(sys_get_temp_dir(), 'wp_upload_');
    // 将二进制流写入临时文件
    file_put_contents($tmpFile, $imageBinary);
    // 构造合法的CURLFile对象,按需替换第二个参数为实际图片mime类型,第三个为文件名
    $cFile = curl_file_create($tmpFile, 'image/png', 'user_upload.png');
    
  • 补全cURL请求逻辑,用完及时清理临时文件
    你之前把$cFile传给CURLOPT_POSTFIELDS的写法本身是合法的,注意请求执行完成后无论成功失败都要删除临时文件,避免磁盘空间泄漏,参考完整逻辑:
    $ch = curl_init();
    // 保留你原有的cURL配置,比如目标URL、请求头、超时设置等
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, [
        'image' => $cFile // 注意POSTFIELDS传数组时,文件字段才会被正确识别为multipart上传
    ]);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    $curlErrNo = curl_errno($ch);
    $curlErrMsg = curl_error($ch);
    curl_close($ch);
    // 清理临时文件
    unlink($tmpFile);
    // 错误记录,方便后续排查
    if ($curlErrNo) {
        error_log(sprintf("图片上传cURL请求失败,错误码:%d,错误信息:%s", $curlErrNo, $curlErrMsg));
    }
    
  • 修正代码后仍报错再检查权限
    用sys_get_temp_dir()获取的系统临时目录默认就给web服务运行用户(Amazon Linux/CentOS下是apache,Ubuntu下是www-data)开了读写权限,不需要额外配置。如果你自定义了临时文件存储路径,按以下步骤校验权限:
    • 执行ps aux | grep httpd(Apache环境)或ps aux | grep nginx(Nginx环境)确认web服务的运行用户
    • 给自定义存储目录授予对应用户的读写权限,比如目录为/var/www/wp_tmp的话,执行以下命令:
      chown apache:apache /var/www/wp_tmp
      chmod 755 /var/www/wp_tmp
      

内容的提问来源于stack exchange,提问作者Learning from masters

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:18:13