2009-05-07 6 views
1

J'utilise la classe HttpConnection de J2ME dans mon application BlackBerry pour envoyer des données à un serveur Web. J'ai besoin d'envoyer le contenu d'une image dans le corps de la requête HTTP.L'envoi de données dans le corps de la requête HTTP échoue

C'est ce que je fais

  1. Obtenez les octets du fichier dans un tableau

  2. connexion ouverte HTTP

  3. Set en-tête de type de contenu comme image/jpeg

  4. Récupère le flux de sortie de la connexion

  5. Ecrire les octets dans le flux de sortie

  6. Fermez le flux de sortie et la connexion

Mais l'image n'a pas été envoyé au serveur. Quel pourrait être le problème?

Merci.

EDIT - Ajout de code

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

Le même code, lorsque je tente avec une chaîne, fonctionne très bien et envoie la chaîne au serveur. Mais c'est toujours un problème avec les octets d'image.

+0

Pourrait-il y avoir un problème du côté du serveur? Essayez de télécharger quelque chose avec d'autres moyens, de sorte que vous êtes certain à ce sujet. – kgiannakakis

+0

J'ai essayé cela. Ça marche. Pas de problème avec le serveur – lostInTransit

Répondre

4

Quelques choses qui peuvent être absents de votre liste:

  • utilisation HttpConnection.setRequestMethod (HttpConnection.POST) entre 2 et 3.
  • jeu de longueur du contenu avec HttpConnection.setRequestProperty ("Content-Length ", ...) entre 5 et 6.
  • sachant que le code de réponse de requête HTTP peut aider à déboguer vos problèmes: appelez HttpConnection.getResponseCode() après avoir fermé le OutputStream mais avant de fermer HttpConnection.
+0

Merci. Je suis déjà en train de définir la méthode de requête. J'ai essayé de définir la longueur du contenu pour voir si cela aide. Mais ce n'est pas le cas. Je reçois un code de réponse de 200 si. Ajout de code si cela aide – lostInTransit

1

Vous certainement besoin de mettre tous les en-têtes avant envoyer les données POST, y compris l'en-tête Content-Length.

De même, assurez-vous d'envoyer des en-têtes valides pour les demandes, et non des en-têtes de réponse uniquement.

+0

Thanks Ed. Comme je l'ai mentionné dans le commentaire de l'autre réponse - j'ai essayé après avoir réglé tous les en-têtes. Toujours l'image n'est pas transférée ... – lostInTransit

0

Vous devrez encoder les octets (de préférence Base-64) et envoyer cette chaîne. Les octets bruts ne sont pas susceptibles d'être protégés par http.

Ensuite, sur le serveur, vous aurez besoin de les décoder de nouveau dans un tableau d'octets et faire tout ce que vous allez faire avec (enregistrer en tant que fichier, des choses dans la base de données, etc.)

2

conn = new HttpConnection (Connecteur.ouvert (myURL));

Cette ligne est erronée. Connection est une classe d'usine qui crée de nouveaux objets Connection en recherchant l'implémentation de protocole appropriée.

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

Le reste du code semble correct. Lorsque vous postez, au minimum, vous devez définir le type de contenu et la longueur du contenu.

Questions connexes