Отправка большого файла в Android - PullRequest
2 голосов
/ 16 декабря 2010

Я иногда получаю OutOfMemoryError при публикации большого файла в Android.Это код, который я использую.Я делаю что-то неправильно?

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 ]

4 голосов
/ 16 декабря 2010

Если вы сделаете это таким образом, весь POST должен быть помещен в буфер. Это потому, что сначала нужно отправить заголовок Content-Length.

Вместо этого, я думаю, вы хотите использовать HTTP-библиотеки Apache, включая FileEntity . Это позволит ему определить длину перед чтением файла. Вы можете использовать этот ответ в качестве отправной точки. Но вторым параметром конструктора FileEntity должен быть тип MIME (например, image / png, text / html и т. Д.).

2 голосов
/ 10 августа 2012

HTTP-соединение в порядке, но HTTPS вызовет ошибку «Недостаточно памяти», поскольку в HttpsURLConnectionImpl.java в Android 2.3.4 (проверено на моем планшете) есть ошибка, и она исправлена ​​в Android 4.1 (я проверил исходный код).

Кстати, он должен избегать буферизации всех данных POST в ОЗУ, добавив "con.setChunkedStreamingMode (0);"сразу после "con.setDoOutput (true);"заявление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...