2011-12-21 4 views
3

У меня возникают проблемы при загрузке файлов через https (HttpsURLConnection). Использование того же кода с HttpURLConnection работает как шарм.Android OutOfMemoryException при загрузке файла на HTTPS

здесь стек:

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?

С уважением, Peter

EDIT1: Я заметил, что если я опускаю:

connection.setChunkedStreamingMode(maxBufferSize); 

с помощью рабочей HttpURLConnection я падаю в этом вопросе. Я знаю, что отправка сообщения с использованием протокола SSL будет генерировать длиннее длины содержимого, так что я изменил размер куска до 2 * MaxBufferSize или даже 20 * MaxBufferSize, но это не имеет никакого значения для меня:/

ответ

1

Как большой это файл, который вы загружаете? Кажется, что вы пытаетесь писать около ~ 20 МБ в буфер output_byte.

Также вы записываете неправильное количество байтов на ваш вывод.

read(buffer, 0, bufferSize); линия не гарантирует bufferSize количество байтов будет считано. Сумма чтения возвращается из вызова выше так:

output_byte.write(buffer, 0, bufferSize); 

должен быть вместо этого:

output_byte.write(buffer, 0, bytesRead); 

Так, например, если вы читаете 1024bytes и попытаться написать 20 * 1024 байт каждый раз, за ​​1 Мб файла, у вас будет 20-кратное количество выходных байтов. Это может привести к ошибке OutOfMemory.

+0

Спасибо за ваш ответ! В любом случае, я уверен, что bufferSize == bytesRead, обратите внимание, что я использую этот фрагмент кода: bytesAvailable = file_input.available(); bufferSize = Math.min (bytesAvailable, maxBufferSize); , чтобы убедиться, что bufferSize == bytesRead. Размер файла около 15-50 МБ – Shaar

+1

ОК, что объясняет это. Кажется, вы читали файл в 20 * 1024 кусках, но отправляли его в 1 кусок. Вы должны отправить его поменьше. Приложения для Android имеют около 16-64 мб памяти, вызванные ОС. Вы не можете его изменить. – Caner

+1

google "android file upload multipart" для деталей – Caner

Смежные вопросы