【问题标题】:Google Photos API mediaItems:batchCreate : NOT_IMAGE: There was an error while trying to create this media itemGoogle Photos API mediaItems:batchCreate:NOT_IMAGE:尝试创建此媒体项目时出错
【发布时间】:2018-10-04 11:24:04
【问题描述】:

我正在尝试使用 C# 将图像文件上传到照片库。

使用的范围: https://www.googleapis.com/auth/photoslibraryhttps://www.googleapis.com/auth/photoslibrary.appendonly

我正在使用以下方法生成 uploadToken:

FileStream fS = new FileStream(fullPath, FileMode.Open, FileAccess.Read);
                byte[] b = new byte[fS.Length];
                fS.Read(b, 0, (int)fS.Length);
                fS.Close();
                var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://photoslibrary.googleapis.com/v1/uploads");
                httpWebRequest.ContentType = "application/octet-stream";

                httpWebRequest.Headers.Add("Authorization:" + "Bearer " + auth_Token);
                httpWebRequest.Headers.Add("X-Goog-Upload-File-Name:" + imageName);
                httpWebRequest.Headers.Add("X-Goog-Upload-Protocol:" + "raw");
                httpWebRequest.Method = "POST";
                using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
                {
                    streamWriter.Write(b);
                    streamWriter.Flush();
                    streamWriter.Close();
                }
                var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();

我在这里成功获取了uploadToken。在此之后,我继续创建 mediaItem,如下所示:

 httpWebRequest = (HttpWebRequest)WebRequest.Create("https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate");
                    httpWebRequest.ContentType = "application/json";
                    httpWebRequest.Headers.Add("Authorization:" + "Bearer " + auth_Token);
                    httpWebRequest.Method = "POST";
                    using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
                    {
                        string albumID = "someid";
                        string itemDesc = "somedesc";
                        string jsonString = "{\"albumId\": \"" + albumID + "\",\"newMediaItems\": [{ \"description\": \"" + itemDesc + "\", \"simpleMediaItem\": { \"uploadToken\": \"" + uploadToken + "\" }}]}";

                        streamWriter.Write(jsonString);
                        streamWriter.Flush();
                        streamWriter.Close();
                    }
                    httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();

现在我得到的回应是:

状态“:{ “代码”:3, "message": "NOT_IMAGE: 尝试创建此媒体项目时出错。" }

我用谷歌搜索了很多,但找不到任何解决这个问题的方法或任何使用谷歌照片库 API 的 mediaUpload 代码块。

请建议我哪里做错了。

-以错误的方式读取/写入文件字节?

-使用Json字符串,写错了?

请帮助我。谢谢。

【问题讨论】:

标签: c# google-photos google-photos-api


【解决方案1】:

在上传步骤期间将图像写入正文时,我设法通过执行以下操作来完成这项工作。希望这会有所帮助!

 using (var stream = httpWebRequest.GetRequestStream())
    {
        stream.Write(b, 0, b.Length);
        stream.Flush();
        stream.Close();
    }

【讨论】:

    【解决方案2】:

    5 GET UPLOAD TOKEN API 有效,只是 Google 文档上的描述有误。输入不是 Base64,而是二进制形式。我在 Postman 中试过(如下截图):

    获取上传令牌 API:https://i.stack.imgur.com/axC7c.png

    上传媒体:https://i.stack.imgur.com/5vDnF.png

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。一般的截图根本没有帮助,请将文本内容作为代码或引用块复制并粘贴到您的答案中。
    • @StefanBecker 谢谢你的建议。不幸的是,我没有在文档中找到这个。我通过试错法找到了这个。
    【解决方案3】:

    在找了好几个地方后,我终于在谷歌偶然发现了这个“IssueTracker”条目,似乎与这篇文章有关:

    https://issuetracker.google.com/issues/117437699

    里面有谷歌的回复说这段代码的问题是在这行代码中使用了StreamWriter

     (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
    

    当 StreamWriter 更改为 BinaryWriter 时,它可以工作。谷歌回复中提供的解释:

    查看 StreamWriter 的文档 - 这似乎正在做 一些适合写字符串的额外编码,但不适用于 二进制数据

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 2022-11-15
      相关资源
      最近更新 更多