调用TikTok图片上传API遇param body.data类型错误,求正确参数格式
问题:TikTok图片上传Multipart请求报错
param body.data is invalid,detail:type incorrect,expected type:binary 错误响应
param body.data is invalid,detail:type incorrect,expected type:binary
现有代码
public function uploadToTikTok( string $endpoint, TikTokStoreAuthData $authData, array $query = [], $body = null, string $requestOptionType = RequestOptions::MULTIPART, ): array { $options = [ $requestOptionType => [ [ 'contents' => file_get_contents(body['image_url']), 'name' => 'data', ], ] ]; $url = $this->buildUrl($endpoint, $authData, $query); return (array)$this->client->post($url, $options); }
核心疑问
根据TikTok官方文档要求,需以二进制字符串形式发送图片,请问代码是否存在问题?应如何设置contents值才能获得成功响应?
解决方案
你的代码存在两个关键问题:
- 变量引用错误:
body['image_url']缺少美元符号,应该是$body['image_url'],否则会被当作未定义常量处理,无法正确读取图片资源路径/URL。 - 二进制数据传递方式:虽然
file_get_contents()返回的是二进制字符串,但部分HTTP客户端(如Guzzle)在处理Multipart表单时,直接传递字符串可能导致服务器无法识别为二进制文件类型。更可靠的方式是使用文件流或明确指定文件名、Content-Type参数。
修正后的代码
public function uploadToTikTok( string $endpoint, TikTokStoreAuthData $authData, array $query = [], $body = null, string $requestOptionType = RequestOptions::MULTIPART, ): array { // 校验必填参数 if (empty($body['image_url'])) { throw new \InvalidArgumentException('Image URL/path is required'); } $options = [ $requestOptionType => [ [ 'name' => 'data', // 使用只读二进制流传递,避免内存占用问题,同时确保二进制格式 'contents' => fopen($body['image_url'], 'rb'), // 指定文件名,帮助TikTok服务器识别文件类型 'filename' => basename($body['image_url']) ], ] ]; $url = $this->buildUrl($endpoint, $authData, $query); return (array)$this->client->post($url, $options); }
替代方案(若必须使用file_get_contents)
如果因环境限制无法使用文件流,可明确设置Content-Type头部:
[ 'name' => 'data', 'contents' => file_get_contents($body['image_url']), 'headers' => ['Content-Type' => 'image/jpeg'], // 根据实际图片类型调整 'filename' => basename($body['image_url']) ]
额外注意事项
- 确保
$body['image_url']是有效路径:本地文件需保证PHP有读取权限,远程URL需确保allow_url_fopen配置开启。 - 若使用远程URL,建议先验证URL可访问性,避免因网络问题导致的读取失败。
内容的提问来源于stack exchange,提问作者rati_geo
相关产品推荐
相关产品推荐

