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

如何用PHP调用API发送语音短信?遇The voice file must be a file错误

错误原因分析与解决方案

错误核心原因

你使用了http_build_query()来构建POST请求体,这个函数会将CURLFILE对象转换为普通字符串(类似CURLFILE Object (...)),而非API要求的multipart/form-data格式的文件上传结构,导致API无法识别到有效的语音文件。

解决方案

直接将包含CURLFILE的关联数组赋值给CURLOPT_POSTFIELDS,无需经过http_build_query()处理。当cURL检测到数组中存在CURLFILE对象时,会自动将请求编码为multipart/form-data格式——这是文件上传的标准格式,能被API正确识别。

修改后的代码

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => 'https://example/api/send',
    CURLOPT_HTTPHEADER => ['api-key: keyxxx='],
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => '',
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => 'POST',
    // 直接传递数组,跳过http_build_query
    CURLOPT_POSTFIELDS => [
        'recipients' => [
            '233550000000'
        ],
        'voice_file' => new CURLFILE('voice_message.mp3'),
    ],
]);

$response = curl_exec($curl);

curl_close($curl);
echo $response;

额外检查项

  • 确认voice_message.mp3路径正确:如果用相对路径,需保证文件和当前PHP脚本在同一目录;建议优先使用绝对路径(如/var/www/your-project/voice_message.mp3)。
  • 检查文件权限:确保PHP进程拥有读取该文件的权限。
  • 验证PHP版本:CURLFILE从PHP 5.5开始支持,若使用更早版本,可改用废弃的@前缀格式:'voice_file' => '@/path/to/voice_message.mp3'(不推荐,仅作兼容参考)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:25:23