Gravity Form附件通过PHP CURL发送失败问题求助
Gravity Forms附件通过CURL发送到外部接口的解决方案
核心问题分析
你当前的代码有两个关键问题:
- 直接传递文件URL无法让接口识别为文件上传,需要使用本地文件路径并通过CURL的文件上传机制处理
- 手动设置
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
相关产品推荐
相关产品推荐

