当前位置: 首页 > 知识库问答 >
问题:

使用OkHttp多部分上传大文件

劳嘉实
2023-03-14

在Android中使用OKHTTP以多部分方式上传单个大文件(更具体地说,上传到s3)时,我有什么选择?

共有1个答案

颛孙航
2023-03-14

在Android中,您通常从URI中分离出来。使用大文件时的问题是,如果试图将完整的流读到字节数组(内存中的所有内容),或者最终创建了使用Uri流的无用文件,那么您很容易遇到OutofMemoryErrorOutofMemoryError。这是因为RequestBody不支持从Stream创建(因为有时OkHttp需要多次读取它,例如,如果您得到一个30倍的重定向)或URI(因为OkHttp不是Android库)。

但是OkHttp提供了库Okio,具有模拟流的方便类(sourcesink)和更方便的内部使用。

因此,要创建BodyRequest表单URI避免由于文件大而导致的任何OutofMemoryError,请按以下方式创建:

private static final MediaType MULTIPART_FOR_DATA = MediaType.parse("multipart/form-data");

private @NotNull RequestBody getFilePart(Uri largeFileUri) {

        return new RequestBody() {
            @Override
            public MediaType contentType() {
                return MULTIPART_FOR_DATA;
            }

            @Override
            public void writeTo(@NotNull BufferedSink sink) throws IOException {
                try (Source source = Okio.source(context.getContentResolver().openInputStream(mediaUri))) {
                    sink.writeAll(source);
                }
            }
        };
    }

感谢所有在GitHub线程https://GitHub.com/square/okhttp/issues/3585中发布和评论的人

 类似资料:
  • 我正在使用这个音频记录和视频文件,它是工作的,但我想用OKHTTP取代它。我没弄明白。有人能帮我一下吗?

  • 由邮递员生成以下代码: 此请求在服务器上生成一个大小为0 Kb的文件。而且我无法放文件。所以,我必须放一个这样的文件: 但我有一个超时选项。 如何使用这种Rest API放置文件?

  • 我试图实现一个进度条来指示一个多部分文件上传的进度。 有人能举个例子说明我会怎么做吗?

  • 它应该很简单:我必须发送文件和一些字符串值。但我想不出怎么做。 根据我发现的一些样本,我首先尝试了以下内容: 它给我一个“400错误请求”错误。 我做错了什么? 编辑:顺便说一句,上面的“getfile()”返回一个File对象。其余的参数都是字符串和int。

  • 我正在构建一个应用程序,需要一个API调用,在其POST body请求中有数组。我正在使用OkHttp 2.6请求API。 Postman中的请求如下所示: 为了实现这一点,我尝试了几种编写的方法,

  • 我正在Spring controller中努力实现多部分文件上传。我读过很多问题,谷歌,但似乎什么都不管用。 我明白了 我的BE控制器: FE,angularJS: HTML: 还有应用程序。属性包括: 更新: 当我按照@Byeon0gam的建议从我的控制器中删除@RequestParam时,我不再会遇到这个错误,但是我的文件在控制器中是空的。虽然在FE服务中,如我所见,它不是空的: