因为file_get_contents会一次性将整个大文件加载到内存,导致内存溢出或超时;应改用fopen+fread分块读取,避免全量加载。

为什么直接用 file_get_contents 读大文件会失败?
KIMI API 要求上传文档时以 base64 编码的二进制内容传入 file_content 字段,但 PHP 默认对大文件(尤其 >2MB)调用 file_get_contents 容易触发内存溢出或超时。不是 API 限制,是 PHP 自身配置和读取方式问题。
- 确保
memory_limit至少设为256M(php.ini或运行时用ini_set('memory_limit', '256M')) - 对超过 10MB 的文件,改用
fopen+fread分块读取再拼接,避免一次性加载:$handle = fopen($filepath, 'rb'); $content = ''; while (!feof($handle)) { $content .= fread($handle, 8192); } fclose($handle); $base64 = base64_encode($content); - 注意:KIMI 当前仅支持
.txt、.pdf、.docx,PDF/DOCX 需先用tcpdf或phpword提取纯文本,否则 base64 后上传会返回invalid_file_format
如何构造符合 KIMI 文档摘要接口的请求体?
KIMI 的文档摘要接口(/v1/files/summaries)不接受 raw body,必须用 multipart/form-data,且字段名固定为 file_content、file_name、file_type —— 不是 file,也不是 document。
-
file_name必须带后缀(如report.pdf),否则返回missing_file_name -
file_type必须小写且匹配:text/plain、application/pdf、application/vnd.openxmlformats-officedocument.wordprocessingml.document - 使用
cURL时禁用CURLOPT_POSTFIELDS直接传数组,应手动构造 boundary:$boundary = '----' . md5(uniqid()); $data = "--{$boundary}\r\n"; $data .= "Content-Disposition: form-data; name=\"file_content\"\r\n\r\n{$base64}\r\n"; $data .= "--{$boundary}\r\n"; $data .= "Content-Disposition: form-data; name=\"file_name\"\r\n\r\n{$filename}\r\n"; $data .= "--{$boundary}\r\n"; $data .= "Content-Disposition: form-data; name=\"file_type\"\r\n\r\n{$mimeType}\r\n"; $data .= "--{$boundary}--\r\n"; - 请求头必须包含:
Content-Type: multipart/form-data; boundary={$boundary}和有效的Authorization: Bearer {$api_key}
问答接口返回 422 Unprocessable Entity 怎么定位?
这个错误几乎全是参数结构问题,不是认证失败。KIMI 的问答接口(/v1/chat/completions)要求明确绑定已上传的文档 ID,并在 messages 中声明上下文来源。
一键设置,在 OpenClaw 和 Claude Code CLI 中使用 Kimi K2.5 (Kimi Code) 作为编程模型。Kimi Code 兼容 Anthropic Messages API——替换……
- 先确认文档是否成功上传并拿到
file_id(响应里是id字段,不是file_id) - 问答请求的
messages必须含role: "user"+content,且content是字符串,不能是数组 - 关键点:必须在请求顶层加
file_ids数组字段(不是嵌套在messages里),例如:[ "file_ids" => ["file_abc123"], "messages" => [ ["role" => "user", "content" => "这份报告的核心结论是什么?"] ] ]
- 如果传了
model参数,只能填kimi-plus(免费版不支持自定义 model),填错会直接 422
为什么摘要结果里中文乱码或截断?
本质是编码未统一。KIMI 接口内部处理 UTF-8,但 PHP 文件读取、cURL 发送、JSON 解析三处都可能引入编码污染。
- 读取源文件前强制声明编码:
$content = file_get_contents($path); $content = mb_convert_encoding($content, 'UTF-8', 'auto'); - cURL 发送前确保
file_content是合法 UTF-8(可用mb_check_encoding($base64, 'UTF-8')验证 base64 字符串本身是否合规) - JSON 解析响应时,用
json_decode($response, true, 512, JSON_INVALID_UTF8_IGNORE)避免因 BOM 或非法字符导致null返回 - 摘要内容若含换行,KIMI 返回的是
\n,PHP 输出到网页需用nl2br(),否则显示为一行
真正卡住人的地方不在 API 调用逻辑,而在文件编码链路和 multipart 构造细节——尤其是 file_type 值和 file_ids 的位置,错一个字符就 422,且错误信息不提示具体哪错。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










