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

调用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值才能获得成功响应?


解决方案

你的代码存在两个关键问题:

  1. 变量引用错误:body['image_url']缺少美元符号,应该是$body['image_url'],否则会被当作未定义常量处理,无法正确读取图片资源路径/URL。
  2. 二进制数据传递方式:虽然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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:23:23