Как загрузить файл с помощью Okhttp3 (REST API) - PullRequest
2 голосов
/ 12 апреля 2020

Я пытаюсь загрузить изображение с помощью загружаемых байтов API Google Фото.

Итак, вот мой запрос с OkHttp3:

Request request = new Request.Builder()
                .addHeader("Authorization", "Bearer " + token)
                .addHeader("Content-type:", "application/octet-stream")
                .addHeader("X-Goog-Upload-Content-Type:",mimeType)
                .addHeader("X-Goog-Upload-Protocol:", "raw")
                .url("https://photoslibrary.googleapis.com/v1/uploads")
                .post(requestBody) // how to build request body?
                .build();

документация говорит: «В тело запроса включите двоичный файл:«

media-binary-data

Что это значит?

Для данного файла, я предполагаю, что это:

byte[] data =  FileUtils.readFileToByteArray(new File(myPath));

Но как вы строите этот запросBody с массивом данных?

EDIT Я уже пробовал:

MediaType mType = MediaType.parse("application/octet-stream; charset=utf-8");
RequestBody requestBody = RequestBody.create(mType,new File(path));

Исключение:

okhttp3.internal.http2.StreamResetException: поток был сброшен: PROTOCOL_ERROR

Заранее спасибо, что поставили меня на дорожку !

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

RequestBody имеет несколько перегруженных фабричных методов:

Похоже, что вы в любом случае правильно указали второй параметр.

Что касается параметра MediaType, я обычно использую MIME-тип базовое изображение вместо указания общего двоичного содержимого, например:

MediaType.parse("image/jpeg")
   or
MediaType.parse("image/png")
   ...
0 голосов
/ 13 апреля 2020

к сожалению я оставил ":" после клавиш параметров !!!!

Request request = new Request.Builder()
                .addHeader("Authorization", "Bearer " + token)
                .addHeader("Content-type", "application/octet-stream")// and no X-Goog-Upload-Content-Type :
                .addHeader("X-Goog-Upload-Content-Type",mimeType)//same
                .addHeader("X-Goog-Upload-Protocol", "raw")//same
                .url("https://photoslibrary.googleapis.com/v1/uploads")
                .post(requestBody) 
                .build();

И для запроса тела:

byte [] data =  FileUtils.readFileToByteArray(file);
RequestBody requestBody = RequestBody.create(mimeTypeOfFile,data);

...