C# 获得;“格式不正确的多部分正文”;尝试将视频上载到YouTube时

C# 获得;“格式不正确的多部分正文”;尝试将视频上载到YouTube时,c#,youtube-data-api,C#,Youtube Data Api,我有一个应用程序可以代表我们的客户将视频上传到YouTube。我们每天管理数千个频道,上传数千个视频。这已经运行多年了。代码是用C#,.NET4.7编写的(实际上它使用的是稍旧的版本,但为了重新编译和测试,我不得不对其进行更新)。它使用RESTAPI(而不是SDK) 由于某种原因,该准则在2018年10月12日(星期五)晚上被打破。我们所有的上传请求都返回400状态和“畸形的多部分正文” 我们至少有6个月没有更改代码(尽管可能超过一年)。我能够在我的开发机器上重现错误。我在Fiddler中查看了

我有一个应用程序可以代表我们的客户将视频上传到YouTube。我们每天管理数千个频道,上传数千个视频。这已经运行多年了。代码是用C#,.NET4.7编写的(实际上它使用的是稍旧的版本,但为了重新编译和测试,我不得不对其进行更新)。它使用RESTAPI(而不是SDK)

由于某种原因,该准则在2018年10月12日(星期五)晚上被打破。我们所有的上传请求都返回400状态和“畸形的多部分正文”

我们至少有6个月没有更改代码(尽管可能超过一年)。我能够在我的开发机器上重现错误。我在Fiddler中查看了原始http请求,没有发现任何问题,尽管我很难找到普通的REST文档来确认内容处置头。我知道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>
POSThttps://www.googleapis.com/upload/youtube/v3/videos?part=snippet,状态HTTP/1.1
授权:持票人
内容类型:多部分/表单数据;边界=“590ce98e-6411-4e49-8dde-d7aa06cb067d”
主持人:www.googleapis.com
内容长度:8305362
预期:100人继续
--590ce98e-6411-4e49-8dde-d7aa06cb067d
内容类型:application/json;字符集=utf-8
内容配置:表单数据;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\n联系Brian Brewder了解更多信息。\n工厂总部\n123-456-7890\n\r\n”,“categoryId”:19,“标签”:[“Tag1”,“Tag2”],“状态”:{“privacyStatus”:“public”,“Embeddeble”:true}
--590ce98e-6411-4e49-8dde-d7aa06cb067d
内容配置:表单数据;name=“文件”;filename=“视频”
内容类型:视频/x-msvideo

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

因此,很明显,造成问题的原因(现在仍然如此)是

Content-Type: multipart/mixed;
不再被接受。我设法通过改变一些东西来获得错误信息,并说只发送
视频/*
应用程序/八位字节流
。不幸的是,虽然我这样做仍然从服务器上得到了确认,但却导致了一个损坏的youtube视频

在这一点上,我试着玩头球,但没有成功。该文件将被YouTube接受,但无法正确显示。我怀疑他们更改或删除了不可恢复上传API。如果他们这样做了,我找不到关于这个的公告

所以,我的“解决方案”——嗯,一个变通办法——是使用可恢复上传协议重新实现我的上传功能

这很管用,没花太长时间。只需确保为这两个请求同时设置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/*" );

这对我很有用-我希望这会有所帮助

我们也遇到了同样的问题,12号我们也破产了。代码(Qt/C++,由于某些原因,没有编写官方C++库),已经运行了3多年。找不到这方面的消息。我想是时候进行逆向工程了:\谢谢。我怀疑他们放弃对不可恢复端点的支持是对的。最后,我重新编写了我们的代码,使用了SDK,它使用了可恢复的端点,一切似乎都恢复了正常。很高兴听到你也修复了它!干杯@Andrea你的youtube上传代码有可能是公开的吗?似乎几乎所有的qt客户端都不再工作了。嗨,Akiva,不幸的是,没有,对不起。我在一家公司工作,我们的消息来源不公开。但正如你从我的回答中看到的,修复相当简单,不需要太长时间。你在用图书馆吗?如果是这样的话,我也许能指出一个解决办法。