在HTTPS上传文件时出现Android OutOfMemoryException

时间:2011-12-21 11:36:24

标签: android ssl https out-of-memory

通过https(HttpsURLConnection)上传文件时遇到麻烦。 使用与HttpURLConnection相同的代码就像魅力一样。

这是堆栈:

ERROR/dalvikvm-heap(29984): Out of memory on a 20932172-byte allocation.
INFO/dalvikvm(29984): "UploadingManager" prio=5 tid=9 RUNNABLE
INFO/dalvikvm(29984):   | group="main" sCount=0 dsCount=0 obj=0x2b085018 self=0x3d4de8
INFO/dalvikvm(29984):   | sysTid=30027 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=3868056
INFO/dalvikvm(29984):   at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:~91)
INFO/dalvikvm(29984):   at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:216)
INFO/dalvikvm(29984):   at org.apache.harmony.luni.internal.net.www.protocol.http.RetryableOutputStream.write(RetryableOutputStream.java:60)
INFO/dalvikvm(29984):   at java.io.DataOutputStream.write(DataOutputStream.java:99)
INFO/dalvikvm(29984):   at com.my.app.utils.UploadingManager$UploadingThread.run(UploadingManager.java:568)

以下是代码: 初始化连接:

URL url = new URL(url_to_send); 
trustAllHosts();
connection = (HttpsURLConnection) url.openConnection();
connection.setHostnameVerifier(DO_NOT_VERIFY);
connection.setChunkedStreamingMode(maxBufferSize);

我使用相同的代码来建立“trustall”ssl连接,如下所述: ssl on android strange issue(我知道他们面临着类似的问题,但我想确保在上传期间我没有犯任何错误)

以下是上传代码:

 File uploaded_file = new File(pathToOurFile);
 file_input = new FileInputStream(uploaded_file);

 output_byte = new DataOutputStream(connection.getOutputStream());

 int maxBufferSize = 20 * 1024;
 bytesAvailable = file_input.available();
 bufferSize = Math.min(bytesAvailable, maxBufferSize);
 buffer = new byte[bufferSize];

 // Read file
 bytesRead = file_input.read(buffer, 0, bufferSize);
 already_send += bytesRead;

 while (bytesRead > 0) {

     output_byte.write(buffer, 0, bufferSize); < ----Exception occurs here
     bytesAvailable = file_input.available();
     bufferSize = Math.min(bytesAvailable, maxBufferSize);
     bytesRead = file_input.read(buffer, 0, bufferSize);
     already_send += bytesRead;

 }

 output_byte.writeBytes(endBoundary);
 output_byte.flush();

您是否知道为什么我会收到OutOfMemoryException?

此致 彼得

EDIT1: 我注意到,如果我省略:

connection.setChunkedStreamingMode(maxBufferSize);

使用工作的httpUrlConnection我遇到了同样的问题。 我知道使用ssl发送相同的消息会产生更长的内容长度,所以我已经将块大小更改为 2 * maxBufferSize 甚至 20 * maxBufferSize ,但这没有任何区别我:/

1 个答案:

答案 0 :(得分:1)

您上传的文件有多大?您似乎正在尝试将约20MB写入output_byte缓冲区。

此外,您正在向输出写入错误的字节数。

read(buffer, 0, bufferSize);行不保证将读取bufferSize个字节数。读取的金额从上面的调用返回:

output_byte.write(buffer, 0, bufferSize);

应该是:

output_byte.write(buffer, 0, bytesRead);

因此,例如,如果您读取1024字节并尝试每次写入20 * 1024字节,对于1MB文件,您将拥有20倍的输出字节。这可能会导致OutOfMemory错误。