1

我有一个无法更改的 REST 服务,其中包含上传图像的方法,编码为 Base64 字符串。

问题是图像的大小可以达到 5-10MB,甚至更多。当我尝试在设备上构建这种大小的图像的 Base64 表示时,我得到了 OutOfMemory 异常。

但是,我可以一次编码字节块(比如说 3000 个),但这没用,因为我需要整个字符串来创建一个 HttpGet/HttpPost 对象:

DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("www.server.com/longString");
HttpResponse response = client.execute(httpGet);

有没有办法解决这个问题?

编辑:尝试使用 Heiko Rupp 的建议 + android 文档,我在以下行出现异常(“java.io.FileNotFoundException: http ://www.google.com”): InputStream in = urlConnection.getInputStream();

    try {
        URL url = new URL("http://www.google.com");
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        urlConnection.setDoOutput(true);
        urlConnection.setChunkedStreamingMode(0);

        OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
        out.write("/translate".getBytes());

        InputStream in = urlConnection.getInputStream();
        BufferedReader r = new BufferedReader(new InputStreamReader(in));
        StringBuilder total = new StringBuilder();
        String line;
        while ((line = r.readLine()) != null) {
            total.append(line);
        }           
        System.out.println("response:" + total);

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

我错过了什么吗?我需要执行的 GET 请求如下所示:“ http://myRESTService.com/myMethod?params=LOOONG-String ”,所以想法是连接到http://myRESTService.com/myMethod然后输出一个一次长字符串的几个字符。这个对吗?

4

2 回答 2

1

您应该尝试使用URLConnectionapache http 客户端而不是 apache http 客户端,因为这不需要您将要发送的对象保存在内存中,而是您可以执行以下操作:

伪代码!

HttpUrlConnection con = restUrl.getConnection();
while (!done) {
  byte[] part = base64encode(partOfImage);
  con.write (part);
  partOfImage = nextPartOfImage();
}
con.flush();
con.close();

同样在 Android 2.2 之后 Google 推荐URLConnectionover the http 客户端。请参阅DefaultHttpClient的描述。

您可能想要查看的另一件事是要发送的数据量。URLConnection通过移动网络传输 10 MB + base64 将需要相当长的时间(即使使用 gzip 压缩,如果服务器端接受它,它会透明地启用)。

于 2012-10-18T08:58:03.060 回答
1

您必须阅读此 REST 服务的文档,此类服务不会要求您在 GET 中发送如此长的数据。图像始终作为 POST 发送。POST 数据始终位于请求的末尾,并且允许迭代添加。

于 2012-10-18T08:58:32.720 回答