gpt4 book ai didi

c# - 尝试将视频上传到 YouTube 时获取 "Malformed multipart body"

转载 作者:行者123 更新时间:2023-12-05 04:04:16 26 4
gpt4 key购买 nike

我有一个应用程序可以代表我们的客户将视频上传到 YouTube。我们管理着数以千计的 channel ,每天上传数以千计的视频。这已经工作了多年。代码是用C#、.Net 4.7 编写的(实际上使用的是稍旧的版本,但我不得不更新它以便重新编译和测试)。它使用 REST API(而不是 SDK)。

由于某种原因,代码在 2018 年 10 月 12 日星期五晚上出现故障。我们所有的上传请求都返回了 400 状态和“Malformed multipart body”。作为 body 。

我们至少有 6 个月没有更改代码(尽管可能超过一年)。我能够在我的开发机器上重现错误。我查看了 Fiddler 中的原始 http 请求,但没有发现任何问题,尽管我很难找到普通的 REST 文档来确认内容配置 header 。我知道 JSON 和视频都很好(我验证了 JSON 并验证了我能够将视频直接上传到 YouTube)。此外,我们进行的所有其他 API 调用都可以正常工作。只是上传是个问题。

这是来自 Fiddler 的 HTTP 请求的副本...

POST https://www.googleapis.com/upload/youtube/v3/videos?part=snippet,status HTTP/1.1
Authorization: Bearer <token>
Content-Type: multipart/form-data; boundary="590ce98e-6411-4e49-8dde-d7aa06cb067d"
Host: www.googleapis.com
Content-Length: 8305362
Expect: 100-continue

--590ce98e-6411-4e49-8dde-d7aa06cb067d
Content-Type: application/json; charset=utf-8
Content-Disposition: form-data; name=json; filename=file.json; filename*=utf-8''file.json

{"snippet":{"title":"77 Wakefield Street, Bald Hills, QLD, 4036","description":"77 Wakefield Street\r\n\r\nContact Brian Brewder for more information.\nTourFactory Corporate Headquarters\n123-456-7890\n\r\n","categoryId":19,"tags":["Tag1","Tag2"]},"status":{"privacyStatus":"public","embeddable":true}}
--590ce98e-6411-4e49-8dde-d7aa06cb067d
Content-Disposition: form-data; name="files"; filename="video"
Content-Type: video/x-msvideo

<video>

似乎在 API 的 YouTube 端发生了一些变化,但我检查了博客,没有看到列出任何内容。由于 Google 使用 StackOverflow 提供支持,我希望有人能帮助我找出问题所在。

最佳答案

所以,显然是什么导致了这个问题(现在仍然如此)

Content-Type: multipart/mixed;

不再被接受。我通过改变一些东西设法得到一条错误消息,并说只发送 video/*application/octet-stream。不幸的是,虽然我这样做仍然可以从服务器上获得 OK,但导致 youtube 视频损坏

broken youtube video

在这一点上,我尝试使用 header 但没有成功。该文件会被 YouTube 接受,但不会正确显示。我怀疑他们更改或删除了不可恢复的上传 API。如果他们这样做了,我找不到相关的公告。

因此,我的“解决方案”——好吧,一个解决方法——是使用可恢复上传协议(protocol)重新实现我的上传功能。

https://developers.google.com/youtube/v3/guides/using_resumable_upload_protocol

这行得通并且没花太长时间。只需确保为两个请求设置 X-Upload-Content-Length 和 x-upload-content-type(首先是元数据,然后是获取上传 URL 后的有效负载)。

因此您首先发布相同的元数据(代码段和状态)并获取 PUT url

QByteArray responseLocation = reply->rawHeader( "Location" );

然后使用相同的 X-Upload-Content-Length 和 x-upload-content-type 创建 PUT 请求

newrequest.setRawHeader( "X-Upload-Content-Length", QByteArray::number( video->size() ) );
newrequest.setRawHeader( "x-upload-content-type", "video/*" );

这对我有用 - 我希望这对您有所帮助!

关于c# - 尝试将视频上传到 YouTube 时获取 "Malformed multipart body",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52844182/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com