【发布时间】:2022-12-17 23:24:40
【问题描述】:
我正在尝试使用视频工具包 api 在 tiktok 上分享视频,我拥有的视频位于谷歌云存储链接上,因此首先我从云中获取该视频并将其附加到带有读取流的表单数据。然后,我使用我的开放 ID 和访问令牌向给定端点发出 axios 发布请求(两者均有效,并且我的发布请求具有正确的标头,即文档中指定的多部分/表单数据)。
const storage = new Storage();
const bucket = storage.bucket("<bucket name>");
const remoteFile = bucket.file("<file path>");
const openId = token['open_id'];
const accessToken = token['access_token'];
const postUrl = process.env.TIKTOK_POST_URL
+ '?open_id=' + openId
+ '&access_token=' + accessToken;
let formData = new FormData();
formData.append('video',remoteFile.createReadStream())
const postResponse = await axios.post(postUrl,formData,{headers: { "Content-Type": "multipart/form-data" }});
console.log(postResponse);
但是,我不断从响应中获得 400 代码以及额外的详细信息;
expecting a binary field `video` in the form-data
我假设我要么没有正确发送视频文件,要么根本没有发送。 到目前为止,我已经尝试过;
- 将带有 axios 的文件作为 blob 下载并发送 blob 本身
- 使用 axios 作为流下载文件并发送
- 使用谷歌库本身下载文件并发送其缓冲区数组
- [当前尝试] 只是获取文件的引用并从中发送写入流
所有这些尝试都导致了相同的错误消息。还有其他人遇到过这个问题吗?文档中没有任何示例,所以我不确定如何处理。我也不想下载视频并将其保存到文件中并尝试发布它,因为我宁愿只从内存中发送文件。
我很感激任何意见。
编辑: 我也试过像这样发布位于我的机器上的视频,
formData.append('video',fs.createReadStream("C:/Users/[ME]/Downloads/tem.mp4"))仍然得到同样的错误。
编辑 2: 我还尝试将这些流中的数据流式传输到一个变量中,并尝试将它们传递到表单数据中,但仍然得到相同的结果
stream.on('data',function(data) { File += data; console.log('streaming data'); }) stream.on('finish',async function() { formData.append('video',File) const postResponse = await axios.post(postUrl,formData,{headers: { "Content-Type": "multipart/form-data" }}); }编辑 3:
上传小尺寸失败后,我注意到您不能上传短于 3 秒的视频,我尝试上传的视频恰好是 3 秒,所以这可能是我尝试上传更大视频的问题,并设法得到另一个错误。
Bad Gateway | KRAKEND.BACKEND/3 - request failed/320202:the server closed connection before returning the first response byte. Make sure the server returns 'Connection: close' response header before closing the connection
【问题讨论】:
-
您正在尝试上传一个阅读流,但您需要上传一个文件。
-
@AlexScott 我试过将 remoteFile 放入表单数据并得到“source.pause is not a function”错误
-
您仍然需要使用该流,但您需要将其
pipe为可写流,或者使用可读流首先将文件中的数据读取到变量中。由于您需要使用FormData,因此第二个选项就是您想要的。 -
嗨,你设法解决这个问题了吗?
标签: javascript node.js axios tiktok