2010-12-06 25 views
0

Ceci est ma méthode en actionscriptobjets de flex à servlet java

var urlVars : URLVariables = new URLVariables(); 
       urlVars.myname = byteArr; 
       var urlReq : URLRequest = new URLRequest('MyServlet'); 
       urlReq.data = urlVars; 
       urlReq.method = 'post'; 
       navigateToURL(urlReq, '_blank'); 

Comment puis-je recois le tableau d'octets sur servlet?

De plus, le byteArr vient au-dessus d'un côté java,

byte[] byteArr = aMethodWhichReturnsaPDFByteArray(); 
     HttpServletResponse response = FlexContext.getHttpResponse(); 
     ServletOutputStream os = null; 
     try { 
      response.reset(); 
      response.setContentType("application/pdf"); 
      response.setContentLength(byteArr.length); 
      response.setHeader("Content-disposition", 
        "inline; filename=\"Report.pdf\""); 
      os = response.getOutputStream(); 
      os.write(byteArr); 
      os.flush(); 
os.close(); 

La méthode ci-dessus ne fonctionne pas.

+0

comment ça n'a pas – Bozho

+0

quand je courais debug, il se déroule bien; il y a une déclaration catch sous os.close(); cependant, aucune exception n'a été interceptée, aucune nouvelle page n'a été ouverte. – Prabhat

Répondre

0

Si vous insistez pour envoyer les params de cette façon, vous feriez mieux de coder le tableau d'octets dans une représentation sous forme de chaîne. Base64 par exemple. Du côté java utilisé commons-codec pour le décoder. Dans les autres cas, voir this article. C'est un peu vieux, mais ça s'applique toujours. Aussi see here

+0

Le tableau d'octets est assez grand. Encoder puis décoder de l'autre côté entraîne des problèmes de performance. Est-ce qu'il y a un autre moyen ? En fait, le tableau d'octets est généré en Java et renvoyé en flexion. Depuis créer une nouvelle réponse de côté Java ne fonctionne pas. – Prabhat

+0

Quelle est la taille? – Bozho

+0

environ 1 Mo. Peut se développer dans un proche avenir. – Prabhat

1

Vous pouvez utiliser BlazeDS pour cela. Je n'ai pas d'exemple de désérialisation sur le serveur mais en voici un pour la sérialisation. Dans un servlet faire quelque chose comme:

response.setHeader("Content-Type", "application/x-amf"); 
ServletOutputStream out = response.getOutputStream(); 

ActionMessage requestMessage = new ActionMessage(MessageIOConstants.AMF3); 

MessageBody amfMessage = new MessageBody(); 
amfMessage.setData(list); 
requestMessage.addBody(amfMessage); 

AmfMessageSerializer amfMessageSerializer = new AmfMessageSerializer(); 
amfMessageSerializer.initialize(SerializationContext.getSerializationContext(), out, new AmfTrace()); 
amfMessageSerializer.writeMessage(requestMessage); 

out.close(); 

Sur le client faire quelque chose comme:

var loader:URLLoader = new URLLoader(); 
loader.dataFormat = URLLoaderDataFormat.BINARY; 
loader.addEventListener(Event.COMPLETE, function(event:Event):void { 
    var ba:ByteArray = (event.currentTarget.data as ByteArray);   
    var packet:AMFPacket = AMFDecoder.decodeResponse(ba) as AMFPacket; 
}); 
loader.load(urlReq); 

Votre cas d'utilisation est similaire à celle, juste sérialisation sur le client et désérialiser sur le serveur.

Vous pouvez trouver tout le code source pour cet exemple à:
http://flexapps.svn.sourceforge.net/viewvc/flexapps/census2-tests/