2009-09-29 13 views
1

Ce que j'essaie de faire est de transférer une image du service Web vers le client mobile. Pour ce faire, j'ai créé une opération de service Web qui renvoie une variable byte []. Dans cette méthode, je crée une image .png à partir d'un graphique. Après cela, je récupère les octets de l'image et les fournisse comme valeur de retour pour l'opération. c'est le code du serveur:service web - application mobile (j2me) transfert de fichier

public byte[] getBytes() throws IOException { 

BufferedImage chartImage = chart.createBufferedImage(230, 260); 
//I get the image from a chart component. 
ByteArrayOutputStream baos = new ByteArrayOutputStream(1000); 


ImageIO.write(chartImage, "png",baos); 


baos.flush(); 
byte[] bytesImage = baos.toByteArray(); 

baos.close(); 

return bytesImage; 
} 

Now in the mobile application all i do is assign a byte[] variable the return value of the web service operation. 

byte[] imageBytes = Stub.getBytes(). 

Peut-être que je manque quelque chose, mais cela ne fonctionne pas comme je reçois cette erreur d'exécution:

java.rmi.MarshalException: Expected Byte, received: iVBORw0KGgoAAAANSUhEU.... (very long line). 

ont des idées pourquoi ce happends? Ou peut-être vous pouvez suggérer n'importe quelle autre manière d'envoyer les données au client mobile.

Répondre

4

Si le service fournit uniquement une image sous la forme d'un tableau d'octets, le surdébit induit en l'enveloppant dans une réponse SOAP et l'analyse XML/SOAP du côté client semble plutôt inutile. Pourquoi ne pas implémenter la génération de graphique dans une servlet et laisser le client récupérer l'image à partir d'une URL de serveur 'non-SOAP'?

au lieu de retourner bytesImage d'une méthode WebService comme vous le faites, vous pourriez plutôt écrire le tableau d'octets à l'objet de la réponse du servlet:

response.setContentType("image/png"); 
response.setContentLength(bytesImage.length); 
OutputStream os = response.getOutputStream(); 
os.write(bytesImage); 
os.close(); 

Sur le client J2ME, vous lire la réponse de l'URL, auquel la servlet est liée et créer une image à partir des données:

HttpConnection conn = (HttpConnection)Connector.open("http://<servlet-url>"); 
DataInputStream dis = conn.openDataInputStream(); 
byte[] buffer = new byte[conn.getLength()]; 
dis.readFully(buffer); 
Image image = Image.createImage(buffer, 0, buffer.length); 

Espérons que cela aide!

+0

Merci beaucoup! Cela a vraiment aidé. La seule chose que j'ai à dire à propos de votre réponse est la suivante: byte [] buffer = new byte [(int) conn.getLength()]. –

Questions connexes