2010-09-14 3 views
1

J'essaie d'envoyer un fichier image à un service Web.Publier un fichier image sur RESTful Web Service

voici mon code:

ConnectionFactory connFact = new ConnectionFactory(); 
     ConnectionDescriptor connDesc; 

     //String value = new String(data); 
     String value= Base64OutputStream.encodeAsString(data, 0, data.length, false, false); 

     value = "imgData=" + value; 

     connDesc = connFact.getConnection("http://localhost:50806/Send"); 
     int iResponseCode = 0; 
     HttpConnection httpConn = null; 
     OutputStream os = null; 
     if (connDesc != null) 
     { 

      try 
      { 
      byte[] theByteArray = value.getBytes(); 

       httpConn = (HttpConnection)connDesc.getConnection(); 

       httpConn.setRequestProperty("Content-Type", "image/jpeg"); 
       httpConn.setRequestMethod(HttpConnection.POST); 
       httpConn.setRequestProperty("Content-Disposition", "form-data"); 
       httpConn.setRequestProperty("Connection", "Keep-Alive"); 
       httpConn.setRequestProperty("Content-Length", String.valueOf(data.length)); 

       //os = httpConn.openOutputStream(); 
       //os.write(theByteArray); 
       DataOutputStream printout = new DataOutputStream (httpConn.openOutputStream()); 
       printout.write(theByteArray); 
       iResponseCode = httpConn.getResponseCode();   
      } 
      catch(Exception e){ 
       e.printStackTrace(); 
      } 
      finally{ 
       if(os != null) 
        os.close(); 

       if(httpConn != null){      
       httpConn.close(); 
       } 
      } 

     } 
    return Integer.toString(iResponseCode); 

Un tableau d'octets représenté le fichier d'image est passé dans la méthode.

signature de service:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Send(string imgData) 
    {} 

Toutes les idées sur la façon d'envoyer cela?

Merci beaucoup, Dan

+0

Qu'attend le service REST? Un tableau encodé en base64? –

+0

Oui, c'est correct. – Dan

+0

Après avoir lu un autre article sur un sujet similaire, j'ai changé mon service pour accepter une chaîne. – Dan

Répondre

1

Une chaîne Base64 va probablement être trop gros pour passer comme paramètre d'URL dans une requête GET. Soit le périphérique ou un proxy en cours de route peut faire quelque chose de mal à la demande. Il serait beaucoup plus sûr d'utiliser une requête POST. Pour ce faire, définissez la demande en tant que POST avec httpConn.setRequestMethod(HttpConnection.POST) et puis écrivez tous les paramètres de formulaire dans le corps de la demande en utilisant httpConn.openOutputStream() (et éventuellement la classe PostData)

+0

Hey Marc, Merci pour votre aide. J'ai mis à jour le code (voir ci-dessus). Cela vous semble-t-il juste? À quoi ressemblerait la signature de méthode de mon service Web? Je ne suis pas sûr de savoir comment obtenir les données d'octets. Merci encore. – Dan

+0

Le code semble bon - vous n'avez probablement pas besoin de vider le système d'exploitation puisque l'appel à httpConn.getResponseCode() le videra automatiquement. En ce qui concerne le webservice, on ne peut vraiment pas y aider car cela dépend de la plate-forme du serveur, etc. Au fond, vous voulez juste lire les octets directement du corps - relativement facile à faire dans les servlets Java, PHP, etc. –

+0

Hey Marc, merci pour la réponse. J'utilise asp.net mvc. Je peux tout faire fonctionner quand j'envoie des valeurs de chaîne plus petites au contrôleur. mais je peux sembler obtenir la valeur de poste. J'ai mis à jour le code et inclus la signature de la méthode de mon contrôleur. Faites-moi savoir si quelque chose ne va pas bien :) Merci encore, beaucoup. – Dan

Questions connexes