Youtube v3 API mediaBodyRequired



问题是:

{
   "error":{
      "errors":[
     {
        "domain":"youtube.video",
        "reason":"mediaBodyRequired",
        "message":"Bad Request",
        "locationType":"other",
        "location":"body"
     }
      ],
      "code":400,
      "message":"Bad Request"
   }
}

我的代码如下:

    private void CreateUploadRequest(SynchronisedAsset asset)
    {
        var endPoint = api.ApiUrl + "/videos?uploadType=resumable&part=snippet"; // read for the different ways to interact with videos https://developers.google.com/youtube/v3/docs/#Videos
        var maxSize = 68719476736; // 64 gig
        try
        {
            var location = CompanyProvider.GetUploadLocation(this.baseUploadDirectory, companyId, FileType.Asset);
            var filePath = System.IO.Path.Combine(location, asset.FileName);
            var fileBytes = System.IO.File.ReadAllBytes(filePath);
            if (maxSize > fileBytes.Length && (asset.MimeType.ToLower().StartsWith("video/") || asset.MimeType.ToLower().Equals("application/octet-stream")))
            {
                var json = Encoding.ASCII.GetBytes("{ "snippet": { "title": "" + asset.FileName + "", "description": "This is a description of my video" } }");
                var request = WebRequest.Create(endPoint);
                request.Headers[HttpRequestHeader.Authorization] = string.Format("Bearer {0}", api.Tokens.AccessToken);
                request.ContentLength = json.Length;
                request.ContentType = "application/json; charset=UTF-8";
                request.Headers["X-Upload-Content-Length"] = fileBytes.Length.ToString();
                request.Headers["X-Upload-Content-Type"] = asset.MimeType;
                request.Method = "POST";
                using (var stream = request.GetRequestStream())
                {
                    stream.Write(json, 0, (int)json.Length);
                }
                var response = request.GetResponse();
            }
        }
        catch (WebException ex)
        {
            eventLog.WriteEntry("Error uploading to youtube.nEndpoint: " + endPoint + "n" + ex.ToString(), EventLogEntryType.Error);
        }
    }

我真的不确定为什么会出现这个错误,从这里的文档来看:

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

它应该会回复200 ok的信息,但我没有。根据谷歌api参考,问题是:

该请求不包括视频内容。

现在我假设这意味着实际的视频,因为我已经传递了json,但我不确定如何(甚至是否)在发布json的同时发布视频。

请帮帮我,这让我发疯了:)

干杯

欢呼,/r3plica

您在示例中遗漏了一些内容(例如api.ApiUrl设置为什么),但如果您只是试图向主体完全由视频字节组成的https://www.googleapis.com/youtube/v3/videos发送PUT请求,则会犯错误。

如果您想实现自己的上传代码,而不是使用客户端库,我强烈建议您按照本HTTP协议级别指南中概述的步骤进行可恢复的上传。它列出了应该向其发送请求的正确URL,以及要使用的相关标头和请求体。

另一种选择是构建一个多部分MIME请求体,并将其发送到正确的URL,但可恢复上传更健壮,可能更容易手动实现。(我不知道有任何协议级别的多部分MIME上传指南。)

不确定,但在If语句中,您有一个或语句,可能需要用括号括起来,(size&&mime)||octet或size&(mime||八位字节)。我认为逻辑在某种程度上失败了。就目前情况来看,我敢打赌超过大小限制的八位字节是导致您出现问题的原因。逻辑读取的方式是,如果大小和mime正常,则执行OR,如果八位字节流正常,则永远不会进行大小检查。我想你想要这个作为你的if语句。

if (maxSize > asset.FileSize && (asset.MimeType.ToLower().StartsWith("video/") || asset.MimeType.ToLower().Equals("application/octet-stream")))

相关内容

  • 没有找到相关文章

最新更新