2010-09-20 27 views
1

Je tente d'avoir mon téléphone android se connecter à mon servlet et lui envoyer une certaine image. La façon dont je me suis dit que je ferais ceci, est d'utiliser la fonction copyPixelsToBuffer() puis d'essayer d'envoyer ceci à la servlet via un flux de sortie (similaire à la façon dont je le ferais dans une application Java normale). Est-ce que ça va marcher? Si oui, quel type de flux est-ce que j'utilise exactement? Dois-je utiliser DataOutputStream et juste faire quelque chose comme ce qui suit:Est-il possible d'envoyer une image à ma servlet en tant que ByteBuffer?

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(); 

Note: Je comprends que ce ne peut pas être la bonne façon de se connecter à un serveur en utilisant le système d'exploitation Android, mais pour l'instant je travaille sur juste comment envoyer l'image, pas la connexion (sauf si cela est pertinent sur la façon dont l'image est envoyée).

Si ce n'est pas une manière que vous recommanderiez d'envoyer l'image à la servlet (j'ai pensé qu'un tampon d'octets serait le meilleur mais je pourrais me tromper), comment recommanderiez-vous que cela soit fait?

Répondre

2

Puisqu'un HttpServlet écoute normalement sur les requêtes HTTP, vous souhaitez utiliser l'encodage multipart/form-data pour envoyer des données binaires via HTTP, au lieu de brut (non formaté) comme ça. Du côté du client, vous pouvez utiliser URLConnection pour cela comme indiqué dans ce mini tutorial, mais cela va être assez verbeux. Vous pouvez également utiliser Apache HttpComponents Client pour cela. Cela ajoute toutefois des dépendances supplémentaires, je ne suis pas sûr si vous souhaitez avoir cela sur Android. Puis, côté serveur, vous pouvez utiliser Apache Commons FileUpload pour analyser les éléments d'un corps de requête codé . Vous pouvez trouver un exemple de code dans this answer à quoi devrait ressembler le doPost() du servlet.

En ce qui concerne votre exemple de code: l'encapsulation dans le DataOutputStream est inutile. Vous ne bénéficiez pas des fonctionnalités de DataOutputStream. Vous utilisez simplement la méthode write(byte[]) qui est déjà fournie par le OutputStream de base tel que renvoyé par URLConnection#getOutputStream(). En outre, le Bitmap a une méthode compress() que vous pouvez utiliser pour le compresser en utilisant un format plus standard et compréhensible (PNG, JPG, etc) dans un OutputStream arbitraire. Par exemple.

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

Est-ce que ce lieu de output.write(bytes) comme dans votre code.

+0

Merci pour l'info, je vais regarder dans ces ressources. – Fizz

+0

De rien. – BalusC