代码之家  ›  专栏  ›  技术社区  ›  dev.farmer

从内存中发送大数据OkHttp3

  •  1
  • dev.farmer  · 技术社区  · 7 年前

    我想在Android中向服务器发送一个PDF图像。

    所以我应该将PDF图像文件转换为Base64字符串。

    <?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()
    }
    

    不同的是我不使用字符串,而是使用文件。

    我创建了一个使用Base64编码文本和XML语法的文件。

    在没有OOM的情况下,如何在Android中发送大数据?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Jesse Wilson    7 年前

    您需要找到一个streaming base64编码器,并使用它来编写一个流到服务器的RequestBody。没有这样的编码器内置到OkHttp或Okio,但你可以在Android中使用。在自定义RequestBody的writeTo方法中获得的OutputStream上使用wrap。

    https://developer.android.com/reference/java/util/Base64.Encoder