J2me multipart / form-data отправка java.lang.exception Ошибка нехватки памяти - требуется помощь - PullRequest
0 голосов
/ 15 октября 2010

Я пытаюсь отправить изображение из своего мидлета на HTTP-сервер. изображения конвертируются в байты и отправлено на сервер в формате http multipart / form-data.

ByteArrayOutputStream bos = new ByteArrayOutputStream();
bos.write(boundaryMessage.getBytes());
bos.write(fileBytes);
bos.write(endBoundary.getBytes());

Когда размер изображения меньше, чем около 500 КБ, тогда код работает нормально, но когда размер больше, чем он показывает: Uncaught исключения java.lang.OutOfMemoryError. Я пытался использовать Java ME SDK 3.0 и Nokia S40 5-е издание FP1. Любая помощь очень ценится. Спасибо за просмотр

Я использовал следующий файл класса: нажмите здесь

Ответы [ 2 ]

4 голосов
/ 15 октября 2010

Принудительное чтение всего файла в память с помощью первого `getFileBytes () для передачи одним фрагментом, скорее всего, приводит к тому, что системе не хватает памяти.

Найдите способ чтенияоколо 100K, передайте его, затем прочитайте еще 100, пока весь файл не будет готов.

Конструктор класса HttpMultipartRequest в том виде, в котором он написан, допускает только передачу файла как одного единственного объекта.Несмотря на то, что это реализация протокола MIME, состоящего из нескольких частей, он ограничен случаем передачи только одной части:

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

С этими тремя строками, находящимися в конструкторе, весь файл отправляется в одной части;

bos.write(boundaryMessage.getBytes());
bos.write(fileBytes);
bos.write(endBoundary.getBytes());

Но в случае с несколькими частями необходимо иметь несколько границ, прежде чем endBoundary:

 for(bytes=getMoreFileBytes(); ! bytes.empty; bytes=getMoreFileBytes()){
        bos.write(boundaryMessage.getBytes());
        bos.write(bytes);
    }
    bos.write(endBoundary.getBytes());

В качестве быстрого исправления позвольте конструктору открыть файл и прочитатьэто 100к за раз.Он уже получает параметр fileName.

Сценарий PHP на другом конце должен собрать исходный файл из частей.

0 голосов
/ 16 октября 2010

Я не очень знаком с правилами форума, я пытался прокомментировать ваш ответ, но он показывает отрицательный результат.

Хорошо .. Теперь я получаю java.io.IOException: постоянное соединение разорвано после отправки первого чанка, не могу повторить попытку

ранее я пытался использовать тип запроса application / x-www-form-urlencoded с кодировкой Base64, используя код kidcandy: http://forums.sun.com/thread.jspa?threadID=538500

Этот код разделяет образные данные на куски, чтобы избежать проблемы «Постоянное прекращение соединения», и создает соединение с сервером с помощью цикла «for». Проблема в том, что максимальный размер фрагмента может составлять всего 500-700 байт. Таким образом, чтобы отправить изображение размером 100 КБ, код должен создать и закрыть соединение 200 раз, я попытался запустить его на телефоне nokia 5310, он ведет себя так, как будто он находится в режиме гибернации ... так что это не полезно.

  1. Теперь я должен использовать цикл for для запроса 'multipart / form-data'?
  2. Каков максимальный размер чанка для этого типа запроса?
  3. Или любая другая идея? Привет
...