在Android中发布大文件

时间:2010-12-15 21:21:29

标签: android post file-upload out-of-memory httpurlconnection

在Android中发布大文件时,我有时会得到OutOfMemoryError。这是我正在使用的代码。难道我做错了什么?

HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setDoInput(true);
con.setDoOutput(true);
ostream = new DataOutputStream(con.getOutputStream());
byte[] buffer = new byte[1536];
int count;
while ((count = fileInput.read(buffer)) != -1) {
    ostream.write(buffer, 0, count); // This sometimes causes OutOfMemoryError
}
ostream.flush();

ostream.flush()循环中调用while会有什么好处吗?

2 个答案:

答案 0 :(得分:4)

如果这样做,整个POST必须缓冲在内存中。这是因为它需要首先发送Content-Length标头。

相反,我认为你想使用Apache HTTP库,包括FileEntity。这将让它在读取文件之前计算出长度。您可以使用this answer作为起点。但FileEntity构造函数的第二个参数应该是mime类型(如image / png,text / html等)。

答案 1 :(得分:2)

HTTP连接没问题,但HTTPS会触发Out of Memory错误,因为Android 2.3.4中的HttpsURLConnectionImpl.java存在错误(在我的平板电脑上验证过),并且已在Android 4.1中修复(我已检查过源代码) )。

顺便说一句,他应该通过添加“con.setChunkedStreamingMode(0);”来避免在RAM中缓冲整个POST数据。紧跟在“con.setDoOutput(true);”之后言。