Загрузить изображение из клиента J2ME в сервлет - PullRequest
1 голос
/ 15 мая 2010

Я хочу отправить изображение с клиента J2ME на сервлет.

Я могу получить байтовый массив изображения и отправить его с помощью HTTP POST.

conn = (HttpConnection) Connector.open(url, Connector.READ_WRITE, true);
conn.setRequestMethod(HttpConnection.POST);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
os.write(bytes, 0, bytes.length); // bytes = byte array of image

Это код сервлета:

String line;
BufferedReader r1 = new BufferedReader(new InputStreamReader(in));
while ((line = r1.readLine()) != null) {
    System.out.println("line=" + line);
    buf.append(line);
}
String s = buf.toString();
byte[] img_byte = s.getBytes();

Но проблема, которую я обнаружил, заключается в том, что при отправке байтов от клиента J2ME некоторые байты теряются.Их значения 0A и 0D hex.Точно, возврат каретки и перевод строки.

Таким образом, ни метод POST, ни readLine() не могут принимать значения 0A и 0D.

Кто-нибудь знает, каксделать это, или как использовать любой другой метод?

1 Ответ

1 голос
/ 15 мая 2010

Это потому, что вы используете BufferedReader для чтения двоичного потока строка за строкой . readLine() в основном разбивает содержимое на CRLF. Эти отдельные строки больше не содержат CRLF.

Не используйте BufferedReader для двоичных потоков, это не имеет смысла. Просто запишите полученный InputStream в OutputStream любого аромата, например, FileOutputStream, обычный способ Java IO .

InputStream input = null;
OutputStream output = null;

try {
    input = request.getInputStream();
    output = new FileOutputStream("/path/to/file.ext");

    byte[] buffer = new byte[10240];
    for (int length = 0; (length = input.read(buffer()) > 0;) {
        output.write(buffer, 0, length);
    }
} finally {
    if (output != null) output.close();
    if (input != null) input.close();
}

Тем не менее, Content-Type, который вы используете, технически неверен. Вы не отправляете значение URL в кодировке WWW в теле запроса. Вы отправляете двоичный поток. Это должно быть application/octet-stream или, может быть, image. Это не является причиной этой проблемы, но это просто неправильно.

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