2

我班级的其中一个领域是文件名。对于序列化,我将编写应该发送文件流的Gson类型适配器(实现)。JsonSerializer<MyClass>

问题是我不希望它读取所有文件数据(流)并将其作为字符串保存在内存中,因为内存大小是有限的(它是移动设备),我必须发送一些其他字段(filename下面的 fe),所以json 应如下所示:

data:
{
    filename:"filename.png"
    filedata:"(base64 file data stream here)"
}

在这种情况下,在网络中将文件数据作为字段发送的最佳方式是什么?

PS。如果有帮助,网络发送由 Apache Http Client 完成

4

1 回答 1

1

在一个请求正文中混合 json 和大型二进制数据似乎不是一个好的架构解决方案。可以改用 http Multipart:

    HttpPost request = new HttpPost(url);

    MultipartEntity multipartEntity = new MultipartEntity();
    request.setEntity(multipartEntity);

    // body
    try {
        multipartEntity.addPart("json", new StringBody(body, "application/json", Charset.forName("utf-8")));
    } catch (UnsupportedEncodingException e) {
        throw new ResourceLoadingException(e);
    }

    // files
    for (int i=0; i<filespaths.size(); i++) {
        String eachFilePath = filespaths.get(i);
        File file = new File(eachFilePath);
        multipartEntity.addPart("file" + String.valueOf(i), new FileBody(file));
    }

Android 不支持 Multipart 主体的移动设备怎么样,但您可以轻松添加对它的支持(如果使用 Maven 或 Gradle):

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpmime</artifactId>
    <version>4.2.5</version>
</dependency>
于 2013-08-20T03:52:51.627 回答