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

如何将TikTok视频上传的Curl命令转换为C# HttpClient实现?

解决TikTok视频上传API的HttpClient转换问题

你的核心问题是错误地将文件路径作为请求体内容发送,而非视频文件的实际二进制数据,这导致服务器无法解析请求,进而强制关闭连接。结合你提供的curl命令,以下是正确的C# HttpClient实现逻辑:

错误点分析

  • 用StringContent(vidPath)把文件路径当成请求体,完全不符合API要求,服务器需要的是视频文件的二进制内容
  • ContentRangeHeaderValue(0, vidSize)参数错误:curl里的bytes 0-30567099/30567100表示起始字节-结束字节/总字节数,结束字节应为总字节数-1,而非总字节数本身
  • 未正确读取文件流,导致请求体内容无效,触发服务器连接关闭

正确实现代码

// 建议全局复用HttpClient,避免频繁创建导致套接字耗尽
private static readonly HttpClient _httpClient = new HttpClient();

public async Task UploadVideoToTikTok(string uploadUrl, string token, string vidPath)
{
    var fileInfo = new FileInfo(vidPath);
    long totalBytes = fileInfo.Length;
    long startByte = 0;
    long endByte = totalBytes - 1; // 结束字节需为总长度减1,匹配curl的Content-Range格式

    using (var request = new HttpRequestMessage(HttpMethod.Put, uploadUrl))
    {
        // 设置授权头
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);

        // 读取文件流作为请求体
        using (var fileStream = fileInfo.OpenRead())
        {
            var content = new StreamContent(fileStream);
            
            // 设置视频文件类型
            content.Headers.ContentType = new MediaTypeHeaderValue("video/mp4");
            
            // 正确设置Content-Range头
            content.Headers.ContentRange = new ContentRangeHeaderValue(startByte, endByte, totalBytes);
            
            request.Content = content;

            // 发送请求并处理响应
            var response = await _httpClient.SendAsync(request);
            response.EnsureSuccessStatusCode(); // 确保请求成功,失败会抛出异常
        }
    }
}

额外注意事项

  • 若视频文件过大,建议使用TikTok API的分块上传功能,避免一次性加载整个文件到内存
  • 确保uploadUrl包含正确的upload_id和upload_token参数,与curl请求地址完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:23:16