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

Gravity Form附件通过PHP CURL发送失败问题求助

Gravity Forms附件通过CURL发送到外部接口的解决方案

核心问题分析

你当前的代码有两个关键问题:

  1. 直接传递文件URL无法让接口识别为文件上传,需要使用本地文件路径并通过CURL的文件上传机制处理
  2. 手动设置Content-Type: multipart/form-data会导致CURL自动生成的边界标识失效,接口无法解析表单数据

完整解决代码

将以下代码替换你原有的函数,注意替换对应参数:

add_action('gform_after_submission_FORM_ID', 'send_gform_data_to_external_api', 10, 2);
function send_gform_data_to_external_api($entry, $form) {
    // 1. 整理表单字段数据(保留你原有的$data映射逻辑)
    $data = array(
        'name' => rgar($entry, '1'),
        'email' => rgar($entry, '2'),
        // 其他字段按你的需求补充
    );

    // 2. 获取Gravity Forms上传的文件(替换为你的文件字段ID)
    $file_field_id = '3';
    $attachments = array();
    $uploaded_files = rgar($entry, $file_field_id);

    if (!empty($uploaded_files)) {
        // 处理多文件上传场景
        if (is_array($uploaded_files) && isset($uploaded_files[0])) {
            foreach ($uploaded_files as $file) {
                // 使用CURLFile替代过时的@语法(PHP 5.5+推荐)
                $attachments[] = new CURLFile(
                    $file['file_path'],
                    $file['mime_type'],
                    basename($file['url'])
                );
            }
        } else {
            // 处理单文件上传场景
            $attachments[] = new CURLFile(
                $uploaded_files['file_path'],
                $uploaded_files['mime_type'],
                basename($uploaded_files['url'])
            );
        }
    }

    // 3. 配置CURL请求
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://playground.europersonal.com/api/public/v1/Bewerbung/Create');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);

    // 构造POST数据
    $post_fields = array(
        'bewerbung' => json_encode($data),
    );
    // 根据接口要求添加附件(如果接口接受多文件数组则直接传$attachments,单文件则传$attachments[0])
    if (!empty($attachments)) {
        $post_fields['attachments'] = $attachments;
    }

    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);

    // 设置请求头:不要手动设置multipart/form-data,CURL会自动处理
    $headers = array(
        'Accept: text/plain',
        'X-Apikey: xxxxx' // 替换为你的实际API密钥
    );
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    $result = curl_exec($ch);
    if (curl_errno($ch)) {
        error_log('CURL Error:' . curl_error($ch)); // 用日志替代echo避免前端报错
    }
    curl_close($ch);

    // 可选:记录API响应日志
    error_log('API Response: ' . $result);
}

关键注意事项

  • 替换FORM_ID为你的Gravity Forms表单ID,file_field_id为实际的文件字段ID
  • 使用Gravity Forms内置的rgar()函数安全获取条目数据,避免数组索引报错
  • CURLFile是PHP 5.5+的推荐写法,替代过时的@语法,解决安全和兼容性问题
  • 必须移除手动设置的Content-Type: multipart/form-data,否则CURL自动生成的边界标识会失效,接口无法解析文件
  • 请根据外部接口文档调整attachments参数的格式:如果接口仅接受单个文件,将$post_fields['attachments'] = $attachments改为$post_fields['attachments'] = $attachments[0]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 06:55:25