Отправка данных в теле HTTP-запроса не удалась - PullRequest
1 голос
/ 07 мая 2009

Я использую класс HttpConnection J2ME в своем приложении BlackBerry для отправки данных на веб-сервер. Мне нужно отправить содержимое изображения в теле HTTP-запроса.

Это то, что я делаю

  1. Получить байты файла в массиве

  2. Открытое HTTP-соединение

  3. Установить заголовок типа контента как изображение / jpeg

  4. Получить выходной поток соединения

  5. Запись байтов в выходной поток

  6. Закрыть выходной поток и соединение

Но изображение не загружается на сервер. В чем может быть проблема?

Спасибо.

РЕДАКТИРОВАТЬ - Добавление кода

HttpConnection conn = null;
OutputStream out = null;

try{
    conn = new HttpConnection(Connector.open(myURL));
    conn.setRequestProperty("Content-Type", "image/jpeg");
    conn.setRequestMethod(HttpConnection.POST);
    conn.setRequestProperty("Content-Disposition", "form-data");
    conn.setRequestProperty("Connection", "Keep-Alive");

    out = conn.openOutputStream;
    out.write(buffer, 0, buffer.length);
    conn.setRequestProperty("Content-Length", buffer.length);
    out.flush();
}
catch(Exception e){
    e.printStackTrace();
}
finally{
    if(out != null)
        out.close();

    if(conn != null){
        System.out.println("" + conn.getResponseCode());
        conn.close();
    }
}

EDIT

Тот же код, когда я пробую его со строкой, работает нормально и отправляет строку на сервер. Но это все еще проблема с байтами изображения.

Ответы [ 4 ]

4 голосов
/ 07 мая 2009

Несколько вещей, которые могут отсутствовать в вашем списке:

  • использовать HttpConnection.setRequestMethod (HttpConnection.POST) между 2 и 3.
  • установить длину содержимого с помощью HttpConnection.setRequestProperty ("Content-Length", ...) в диапазоне от 5 до 6.
  • знание кода ответа на запрос HTTP может помочь отладить ваши проблемы: вызовите HttpConnection.getResponseCode () после закрытия OutputStream, но до закрытия HttpConnection.
2 голосов
/ 16 июня 2009

conn = new HttpConnection (Connector.open (myURL));

Эта строка неверна. Connection - это фабричный класс, который создает новые объекты Connection, просматривая соответствующую реализацию протокола.

HttpConnection conn = (HttpConnection) Connector.open(myURL);

Остальная часть кода выглядит нормально. Когда вы выполняете POSTing, в minimun вам нужно определить тип контента и длину контента.

1 голос
/ 08 мая 2009

Вам определенно необходимо установить все заголовки до отправки данных POST, включая заголовок Content-Length.

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

0 голосов
/ 21 мая 2009

Вам нужно будет закодировать байты (предпочтительно Base-64) и отправить эту строку. Необработанные байты вряд ли будут безопасны для http.

Затем на сервере вам нужно будет декодировать их обратно в байтовый массив и делать с ним все, что вы собираетесь делать (сохранить как файл, заполнить базу данных и т. Д.)

...