我想将 PDF 图像发送到 Android 中的服务器。
服务器规范需要我应该使用 Base64 编码。
所以我应该将 PDF 图像文件转换为 Base64 字符串。
下面是 HTTP POST 请求:
<?xml version="1.0" encoding="UTF-8"?>
<request>
<auth>
<!-- auth info -->
</auth>
<imagefile>
<filename>Test Attachment</filename>
<type>pdf</type>
<data>"HERE IS BASE64 String"</data>
</imagefile>
</request>
我使用了下面的代码,它只是 Http post 请求代码。
fun post(url: String, xml: String) = Observable.defer {
val request = Request.Builder()
.url(url)
.post(RequestBody.create(contentType, xml))
.build()
okHttpClient.newCall(request).execute()
}
对于较小的 pdf 文件,没问题。 (效果很好)
但是当我使用较大的pdf文件(超过20MB)时,会出现内存不足的情况。
所以我尝试了另一种方法,如下所示。
fun post(url: String, xmlFile: File) = Observable.defer {
val request = Request.Builder()
.url(url)
.post(RequestBody.create(contentType, xmlFile))
.build()
okHttpClient.newCall(request).execute()
}
不同的是我不使用String,而是使用File。
我使用 Base64 编码文本和 XML 语法创建了一个文件。
但是也失败了。
如何在Android中发送大数据而不发生OOM?
最佳答案
您将需要找到一个流式 Base64 编码器,并使用它来编写流式传输到服务器的 RequestBody。 OkHttp 或 Okio 中没有内置这样的编码器,但您可以使用 Android 本身中的编码器。对您将在自定义 RequestBody 的 writeTo 方法中获得的 OutputStream 使用 wrap。
https://developer.android.com/reference/java/util/Base64.Encoder
关于android - 发送大数据 OkHttp3 内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54035531/