Отправлять объекты из flex в Java-сервлет
Это мой метод в actionscript
var urlVars : URLVariables = new URLVariables();
urlVars.myname = byteArr;
var urlReq : URLRequest = new URLRequest('MyServlet');
urlReq.data = urlVars;
urlReq.method = 'post';
navigateToURL(urlReq, '_blank');
Как получить массив байтов на сервлет?
Кроме того, 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();
Вышеуказанный метод не работает.
Ответы
Ответ 1
Если вы настаиваете на отправке параметров таким образом, вам лучше закодировать массив байтов в строчном представлении. Base64, например. На стороне java используется commons-codec для его декодирования.
В противном случае см. в этой статье. Это немного устарело, но по-прежнему применяется. Также см. Здесь
Ответ 2
Вы можете использовать BlazeDS для этого. У меня нет примера для десериализации на сервере, но вот для сериализации. В сервлет сделать что-то вроде:
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/
Ответ 3
Библиотека загрузки файлов Commons приходит на помощь! Просто передайте объект запроса объекту ServletFileUpload. Подробный пример можно найти здесь
http://commons.apache.org/fileupload/using.html