0

問題は次のとおりです。

{
   "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 メッセージで戻ってくるはずですが、そうではありません。Google APIリファレンスによると、問題は次のとおりです。

リクエストに動画コンテンツが含まれていません。

すでにjsonを渡したので、実際のビデオを意味すると思いますが、jsonと同時にビデオを投稿する方法(または場合でも)がわかりません。

私を助けてください、これは私を狂わせています:)

乾杯

乾杯、/r3plica

4

2 に答える 2

1

例からいくつかのものを除外していますが (設定内容など)、本体が完全にビデオ バイトで構成されapi.ApiUrlている PUT リクエストを送信しようとしている場合は、間違いを犯しています。https://www.googleapis.com/youtube/v3/videos

クライアント ライブラリを使用するのではなく、独自のアップロード コードを実装する場合は、この HTTP プロトコル レベルのガイドで説明されている再開可能なアップロードの手順に従うことを強くお勧めします。リクエストの送信先となる正しい URL と、使用する関連ヘッダーとリクエスト ボディがリストされています。

別の方法として、マルチパート MIME リクエスト本文を作成し、それを正しい URL に送信することもできますが、再開可能なアップロードはより堅牢であり、手動で実装する方がおそらく簡単です。(そして、マルチパート MIME アップロードに関するプロトコル レベルのガイドについては知りません。)

于 2013-06-24T20:33:05.020 に答える
0

確かではありませんが、If ステートメントには or ステートメントがあり、おそらく括弧で囲む必要があります , (size && mime ) || オクテットまたはサイズ && (mime || オクテット)。どういうわけかロジックが失敗していると思います。現状では、サイズ制限を超えているオクテットが問題の原因であるに違いありません。ロジックが読み取る方法は、サイズと MIME が OK の場合、OR に進み、オクテット ストリームが OK の場合であり、サイズ チェックは行われません。if ステートメントにこれが必要だと思います。

if (maxSize > asset.FileSize && (asset.MimeType.ToLower().StartsWith("video/") || asset.MimeType.ToLower().Equals("application/octet-stream")))
于 2013-06-24T15:23:44.447 に答える