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

3
我正在尝试使用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: 流被重置: 协议错误(PROTOCOL_ERROR)

非常感谢您帮助我找到正确的方向!


1
你有查看过“recipe”来发布文件的方法吗?- https://square.github.io/okhttp/recipes/#posting-a-file-kt-java - homerman
2个回答

1

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

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


1

RequestBody有几个重载的工厂方法:

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

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

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

我已经测试了所有这些技巧...每次都出现 PROTOCOL ERROR :( - Aristide13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接