我想将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文件(超过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。
我使用具有XML语法的Base64编码文本创建了一个文件。
但是它也失败了。
如何在没有OOM的情况下在Android中发送大数据?
答案 0 :(得分:1)
您将需要找到一个流式base64编码器,并使用该编码器编写一个流式传输到服务器的RequestBody。 OkHttp或Okio没有内置这种编码器,但是您可以在Android本身中使用它。在您自定义RequestBody的writeTo方法中获得的OutputStream上使用wrap。
https://developer.android.com/reference/java/util/Base64.Encoder