Можно ли отправить изображение на мой сервлет в качестве байтового буфера? - PullRequest
1 голос
/ 20 сентября 2010

Я пытаюсь подключить свой телефон Android к сервлету и отправить ему определенное изображение.Я решил, что это можно сделать, используя функцию copyPixelsToBuffer(), а затем попытаться отправить ее сервлету через некоторый поток вывода (аналогично тому, как я сделал бы это в обычном автономном Java-приложении).Будет ли этот способ работать?Если да, то какой именно поток я использую?Должен ли я просто использовать DataOutputStream и просто сделать что-то вроде следующего:

ByteBuffer imgbuff;
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
bm.copyPixelsToBuffer(bm);

...code...
URLConnection sc = server.openConnection();
sc.setDoOutput(true);

DataOutputStream out = new DataOutputStream( sc.getOutputStream() );
out.write(imgbuff.array());
out.flush();
out.close();

Примечание: я понимаю, что это может быть неправильный способ подключения к серверу с помощью ОС Android, но на данный момент яработая только над тем, как отправить изображение, а не с подключением (если это не имеет отношения к тому, как отправляется изображение).

Если это не тот способ, который вы бы порекомендовали отправить в сервлет (это я поняллучше всего использовать байтовый буфер, но я могу ошибаться) как бы вы порекомендовали это сделать?

1 Ответ

2 голосов
/ 21 сентября 2010

Поскольку HttpServlet обычно прослушивает HTTP-запросы, вы хотите использовать кодировку multipart/form-data для отправки двоичных данных по HTTP, а не в необработанном виде (без форматирования), как это.

Со стороны клиента вы можете использовать URLConnection для этого, как описано в этом мини-учебнике , но это будет довольно многословно. Для этого вы также можете использовать Apache HttpComponents Client . Это добавляет, однако, дополнительные зависимости, я не уверен, что вы хотели бы иметь это на Android.

Затем на стороне сервера вы можете использовать Apache Commons FileUpload , чтобы проанализировать элементы из тела запроса, закодированного в multipart/form-data. Вы можете найти пример кода в этом ответе как должен выглядеть doPost() сервлета.

Что касается вашего примера кода: перенос в DataOutputStream не требуется. Вы не пользуетесь услугами DataOutputStream. Вы просто используете write(byte[]) метод, который уже предоставлен базовым OutputStream, возвращаемым URLConnection#getOutputStream(). Кроме того, Bitmap имеет метод compress(), который можно использовать для его сжатия с использованием более стандартного и понятного формата (PNG, JPG и т. Д.) В произвольный OutputStream. Э.Г.

output = connection.getOutputStream();
// ...
bitmap.compress(CompressFormat.JPEG, 100, output);  

Сделайте это вместо output.write(bytes) как в вашем коде.

...