我有一个应用程序可以代表我们的客户将视频上传到YouTube。我们每天管理数千个频道并上传数千个视频。这已经工作了多年。该代码是用C#.Net 4.7编写的(实际上使用的是稍旧的版本,但是我必须对其进行更新才能重新编译和测试)。它使用REST API(而不是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>
似乎API的YouTube端必须进行了某些更改,但我检查了博客,但未看到任何内容。由于Google使用StackOverflow来提供支持,因此希望有人可以帮助我确定问题所在。
答案 0 :(得分:2)
所以,显然是造成问题的原因(现在仍然如此)
Content-Type: multipart/mixed;
不再被接受。我设法通过更改一些内容得到一条错误消息,并说只发送video/*
或application/octet-stream
。不幸的是,尽管我仍然可以从服务器上获得确认,但导致YouTube视频损坏了
在这一点上,我尝试使用标题,但没有成功。该文件将被YouTube接受,但无法正确显示。我怀疑他们更改了(或删除了)非断点上传API。如果他们这样做,我将找不到关于此事的公告。
因此,我的“解决方案”(是一种解决方法)是使用可恢复上传协议重新实现我的上传功能。
https://developers.google.com/youtube/v3/guides/using_resumable_upload_protocol
这有效,并且没有花费太长时间。只需确保为两个请求都设置X-Upload-Content-Length和x-upload-content-type(首先是元数据,然后是获得上传放置URL的有效载荷)。
因此,您首先发布相同的元数据(代码段和状态)并获取PUT网址
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/*" );
对我有用-我希望这会有所帮助!