API Google Фото mediaItems: batchCreate: NOT_IMAGE: при создании этого элемента мультимедиа произошла ошибка

Я пытаюсь загрузить файл изображения в библиотеку фотографий с помощью C #.

Используемые области: https://www.googleapis.com/auth/photoslibrary https://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();

Теперь в ответ я получаю:

status ": {" code ": 3," message ":" NOT_IMAGE: произошла ошибка при попытке создать этот элемент мультимедиа. "}

Я много гуглил, но не смог найти никакого решения для этой проблемы ИЛИ любого блока кода для mediaUpload с использованием API библиотеки Google Фото с примером.

Пожалуйста, подскажите, где я делаю не так.

-Неправильное чтение / запись байтов в файл?

-Использование строк Json и неправильная запись?

Помогите, пожалуйста. Спасибо.


person Saurav Anand    schedule 04.10.2018    source источник
comment
Какая ценность uploadToken? (Кроме того, у меня такая же проблема, за исключением того, что я использую react-native)   -  person mbunch    schedule 15.12.2018
comment
Аналогично: stackoverflow.com/questions/51746830/   -  person mbunch    schedule 15.12.2018
comment
Я знаю немного поздно, но, чтобы облегчить жизнь, я создал библиотеку .NET (пакет nuget) для API Google Фото, которая обрабатывает все это за вас ... github.com/f2calv/CasCap.Apis.GooglePhotos   -  person alv    schedule 18.09.2020


Ответы (3)


Мне удалось выполнить эту работу, выполнив приведенное ниже при записи изображения в тело на этапе загрузки. Надеюсь это поможет!

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

5 ПОЛУЧИТЬ ЗАГРУЗИТЬ ТОКЕН API работает найти, просто описание неверно в документации Google. Вместо Base64 вводится двоичный формат. Я пробовал в Postman (снимок экрана ниже):

Получить API токена загрузки: https://i.stack.imgur.com/axC7c.png

Загрузить медиа: https://i.stack.imgur.com/5vDnF.png

person Pramod Mali    schedule 01.02.2019
comment
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится. Скриншоты в целом бесполезны, скопируйте и вставьте текстовое содержимое в виде блоков кода или цитат в свой ответ. - person Stefan Becker; 01.02.2019
comment
@StefanBecker благодарим вас за предложения. К сожалению, я не нашел этого в документации. Я нашел это методом проб и ошибок. - person Pramod Mali; 05.06.2019

После поиска в нескольких местах я наконец наткнулся на эту запись "IssueTracker" в Google, которая, похоже, связана с этим сообщением:

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

В нем есть ответ от Google, что проблема с этим кодом заключается в использовании StreamWriter в этой строке кода.

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

Когда StreamWriter меняется на BinaryWriter, он работает. Объяснение, предложенное в ответе Google:

Глядя на документацию для StreamWriter - похоже, это делает некоторую дополнительную кодировку, которая подходит для записи строк, но не для двоичных данных.

person Der Wolf    schedule 14.10.2019