将对象从flex发送到java servlet

这是我在actionscript中的方法

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

如何在servlet上接收字节数组?

上面的byteArr也来自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(); 

上述方法不起作用。

如果你坚持以这种方式发送参数,你最好用字符串表示法编码字节数组。 以Base64为例。 在java端使用commons-codec来解码它。

否则,请参阅此文章 。 它有点旧,但仍然适用。 另见这里

你可以使用BlazeDS。 我没有在服务器上反序列化的示例,但这里有一个用于序列化。 在servlet中执行以下操作:

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

在客户端做类似的事情:

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

您的用例与此类似,只需在客户端上序列化并在服务器上反序列化。

您可以在以下位置找到此示例的所有源代码:
http://flexapps.svn.sourceforge.net/viewvc/flexapps/census2-tests/

Commons File Upload库进入营救之中! 只需将请求对象传递给ServletFileUpload对象即可。 这里可以找到一个详细的例子

http://commons.apache.org/fileupload/using.html