繁体   English   中英

如何使用 Okhttp3 (REST API) 上传文件

[英]How to upload file with Okhttp3 (REST API)

我正在尝试通过上传 Google Photos API 字节来上传图片。

所以这是我对 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();

文档说:“在请求正文中,包含文件的二进制文件:”

媒体二进制数据

这是什么意思?

对于给定的文件,我假设它是:

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

但是如何用数据数组构建这个 requestBody 呢?

编辑我已经尝试过:

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

例外:

okhttp3.internal.http2.StreamResetException:stream 已重置:PROTOCOL_ERROR

提前感谢您让我走上正轨!

RequestBody有一些重载的工厂方法:

看起来您在任何一种情况下都正确地提供了第二个参数。

至于MediaType参数,我通常使用底层图像的 MIME 类型,而不是指定一般的二进制内容,例如:

MediaType.parse("image/jpeg")
   or
MediaType.parse("image/png")
   ...

不幸的是,我在参数键之后留下了“:”!!!!

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();

对于 requestBody:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM