OutputStream OutOfMemoryError при отправке HTTP

Пока вы не предоставили достаточно информации, чтобы фактически указать, ГДЕ вы должны извлекать данные, вам нужно вытащить ее откуда-то. Вы можете указать URL-адрес в нагрузке, а также определить параметры данных или функцию обратного вызова.

$("#getCameraSerialNumbers").click(function () {
    $("#step1Content").load('YourUrl');
});

http://api.jquery.com/load/

14
задан Raedwald 30 March 2015 в 18:07
поделиться

4 ответа

httpurLConnection является буферизацией данных, так что он может установить заголовок длиной содержимого (на HTTP ).

Одна альтернатива, если ваш сервер назначения поддерживает его, должен использовать « переводы . Это будет буфер только небольшую часть данных за раз. Однако не все услуги поддерживают его (Amazon S3, например, не).

Еще одна альтернатива (и IMO лучшего) - использовать jakarta httpClient . Вы можете установить «Entity» в запросе из файла, а код подключения установит запрос заголовки соответствующим образом.


Редактировать: NOS прокомментировал, что OP может вызывать httpurlconnection.setfixedLenceStreamingMode (длинная длина) . Я не знал об этом методе; Он был добавлен в 1,5, и я не использовал этот класс с тех пор.

Однако I все еще предлагает использовать Jakarta httpClient, по той простой причине, что это уменьшает объем кода, который должен поддерживать OP. Код, который является котельной, но все еще имеет потенциал для ошибок:

  • ОП правильно обрабатывает петлю для копирования между входом и выходом. Обычно, когда я вижу пример этого, плакат либо неправильно проверяет возвращенный размер буфера, либо продолжает повторно распределять буферы. Поздравляем, но теперь вы должны убедиться, что ваши преемники принимают столько же ухода.
  • Обработка исключений не совсем так хорошо. Да, op запоминает, чтобы закрыть соединения в , наконец, блок, и снова, поздравляю с этим. За исключением того, что либо из Close () вызовов может бросить IOException , сохраняя другой от выполнения. И метод в целом броски исключение , так что компилятор не поможет поймать подобные ошибки.
  • Я подсчитываю 31 строки кода для настройки и выполнения ответа (исключая проверку кода ответа и вычисления URL, но в том числе Thrue / Catch / наконец). С httpclient, это было бы где-то в диапазоне полдюжины лока.

Даже если OP идеально написал этот код, и изменить его в методы, аналогичными тем, кто в Джакарте ОБООН, / он не должен делать это . Этот код был написан и протестирован другими. Я знаю, что это трата моего время, чтобы переписать его и подозревать, что это пустая трата времени ОП.

15
ответ дан 1 December 2019 в 12:13
поделиться

Проблема в том, что класс httpurLConnection использует байтовый массив для хранения ваших данных. Предположительно, это видео вы нажимаете, принимает больше памяти, чем доступно. У вас есть несколько вариантов:

  1. Увеличьте память к вашему приложению. Вы можете использовать опцию -xMX1024M, чтобы дать 1 ГБ памяти в ваше приложение. Это увеличит объем данных, которые вы можете хранить в памяти.

  2. Если вы все еще заканчиваете память, вы можете рассмотреть возможность попробовать другую библиотеку, чтобы нажать видео вверх, что не хранит данные все в памяти одновременно. Apache Commons HttpClient имеет такую ​​функцию. Смотрите этот сайт для получения дополнительной информации: http://hc.capache.org/httpclient-3.x/features.html . Смотрите этот раздел для многочастотной формы загрузки больших файлов: http://hc.capache.org/httpclient-3.x/methods/multipartpost.html

2
ответ дан 1 December 2019 в 12:13
поделиться

Для чего-либо, кроме основных GET-операций, встроенный java.net HTTP-файл не очень хорош. Для этого рекомендуется использовать Apache Commons HttpClient. Он позволяет делать гораздо более интуитивные вещи, как например:

PutMethod put = new PutMethod(url);
put.setRequestEntity(new FileRequestEntity(localFile, contentType));
int responseCode = put.executeMethod();

, который заменяет много вашего кода boiler-пластинки.

2
ответ дан 1 December 2019 в 12:13
поделиться

Ваша проблема заключается в том, что вы пытаетесь исправить X Video Bytes в байт X / N ОЗУ, когда N> 1.

Вам либо нужно прочитать видео в меньший буфер И напишите его, как вы идете или сделаете файл меньше или увеличьте память, доступную для вашего процесса.

Проверьте размер кучи. Вы можете использовать -xmx, чтобы увеличить его, если вы приняли по умолчанию.

-1
ответ дан 1 December 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: