- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序可以代表我们的客户将视频上传到 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 视频损坏
在这一点上,我尝试使用 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/
我是一名优秀的程序员,十分优秀!