我有一个无法改变的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(); < / p>
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 然后一次输出长字符串的几个字符。这是对的吗?
答案 0 :(得分:1)
您应该尝试使用URLConnection
而不是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推荐URLConnection
通过http客户端。请参阅DefaultHttpClient的说明。
您可能想要研究的另一件事是要发送的数据量。 10 MB + base64将需要相当长的时间来传输(即使使用gzip压缩,URLConnection
,如果服务器端接受它,则透明地启用它)。
答案 1 :(得分:1)
您必须阅读此REST服务的文档,此类服务不会要求您在GET中发送此类长数据。图像始终作为POST发送。 POST数据始终在请求结束时允许迭代添加。