- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在通过 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 吗?
问候,彼得
编辑 1:我注意到如果我省略:
connection.setChunkedStreamingMode(maxBufferSize);
使用有效的 httpUrlConnection 我遇到了同样的问题。我知道使用 ssl 发送相同的消息会产生更长的内容长度,所以我将 block 大小更改为 2 * maxBufferSize 甚至 20 * maxBufferSize 但这对我:/
最佳答案
您上传的文件有多大?看来您正在尝试将大约 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
错误。
关于在 HTTPS 上上传文件时出现 Android OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8589177/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!