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

PHP构造含字段与文件的CURL POST请求对接Vitrium API遇阻求助

问题分析与解决方案

你的核心问题是对PHP curl处理multipart/form-data请求的逻辑理解有误,以下是具体错误点和修正方案:

错误点梳理

  1. 手动设置multipart/form-data头:curl会自动生成包含正确边界标识的Content-Type头,手动设置会丢失边界信息,导致API无法解析请求。
  2. 错误编码POST参数:你将整个参数数组json_encode后传递,这完全不符合multipart/form-data的格式要求——该格式需要的是键值对形式的表单数据,而非JSON字符串。
  3. 过时的文件上传方式:@符号上传文件在PHP 5.5+已被废弃,且默认被禁用,必须使用CURLFile类来处理文件上传。
  4. settings参数格式错误:原CURL命令中settings是JSON字符串,你直接传递了数组,API无法识别。

修正后的完整代码

// 初始化curl
$curl = curl_init($url);

// 基础curl配置
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);

// 处理settings参数:转成JSON字符串
$settings = array(
    "Id" => "",
    "FolderId" => $folder_id,
    "PolicyId" => "",
    "FileName" => $file_name,
    "Title" => $file_name,
    "SkipPages" => "",
    "ExternalKey" => "",
    "VersionName" => "Version 1",
    "EnableVersionNotification" => true
);
$settingsJson = json_encode($settings, JSON_UNESCAPED_SLASHES);

// 处理文件上传:使用CURLFile
$tmp_file = $_FILES['pdf_file']['tmp_name'];
$fileMimeType = $_FILES['pdf_file']['type'] ?: 'application/pdf'; // 优先用上传的MIME, fallback到pdf
$curlFile = new CURLFile($tmp_file, $fileMimeType, $file_name);

// 构造正确的POST参数数组
$postFields = array(
    'settings' => $settingsJson,
    'rawfile' => $curlFile
);

// 设置POST数据(直接传数组,curl自动处理multipart/form-data)
curl_setopt($curl, CURLOPT_POSTFIELDS, $postFields);

// 设置请求头:去掉手动的Content-Type,保留其他必要头
$headers = array(
    "X-VITR-SESSION-TOKEN: " . $vit_auth_resp['token'],
    "X-VITR-ACCOUNT-TOKEN: " . $vit_auth_resp['accountId'],
    "Accept: application/json"
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

// 执行请求并处理响应
$json_response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($json_response === false) {
    // 调试用:输出curl错误
    echo 'CURL Error: ' . curl_error($curl);
}
curl_close($curl);

关键修改说明

  • 移除手动Content-Type头:curl会自动生成Content-Type: multipart/form-data; boundary=xxx的头,确保API能正确解析表单边界。
  • 使用CURLFile上传文件:这是PHP 5.5+推荐的安全文件上传方式,避免了@符号的安全风险,同时兼容现代PHP版本。
  • 正确格式化settings参数:将数组转成JSON字符串后再放入POST参数,匹配原CURL命令中-F 'settings={some json}'的格式要求。
  • 添加调试逻辑:增加了curl错误捕获和HTTP状态码获取,方便后续排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 05:50:29