我在 AS3 中有需要压缩的 XML 数据,在我的 Java Google App Engine servlet 上进行验证,然后保存到 Google Cloud Storage 中的文件中。稍后,该文件将由 AS3 客户端打开并解压缩。如果我使用纯 XML 或文本执行此过程,则该过程有效,但如果我使用 ByteArray#compress 数据,它会在 ByteArray#uncompress 期间因“解压缩数据时出错”而死。
我已经尝试在不同的点设置内容类型和 mime 类型,以及使用 Base64 进行编码,但每次尝试似乎都以不同的方式中断,我从来没有收到与我发送的相同的 XML。我需要使用多部分?我应该在服务器上压缩吗?这样做的最佳做法是什么?
从 AS3 发送数据:
// compress xml using zlib
var xml:XML = <contents><thing>value</thing></contents>;
var bytes:ByteArray = new ByteArray();
bytes.writeObject(xml);
bytes.position = 0;
bytes.compress();
var request:URLRequest = new URLRequest(url);
var urlVariables :URLVariables = new URLVariables();
urlVariables.filename = "somefile.bin";
urlVariables.contents = bytes;
request.data = urlVariables;
request.method = URLRequestMethod.POST;
loader = new URLLoader();
loader.load(request);
在 Java servlet 中接收它并创建文件:
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String filename = req.getParameter("filename");
byte[] contents = req.getParameter("contents").getBytes();
GSFileOptionsBuilder optionsBuilder = new GSFileOptionsBuilder()
.setBucket("bucketname")
.setKey(filename)
.setAcl("public-read")
.setMimeType("binary/octet-stream");
AppEngineFile writableFile = fileService.createNewGSFile(optionsBuilder.build());
boolean lockForWrite = true;
FileWriteChannel writeChannel = fileService.openWriteChannel(writableFile, lockForWrite);
writeChannel.write(ByteBuffer.wrap(contents));
writeChannel.closeFinally();
}
在 AS3 中打开新文件:
var url :String = "http://commondatastorage.googleapis.com/bucketname/somefile.bin";
var request:URLRequest = new URLRequest(url);
request.method = URLRequestMethod.GET;
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, handleComplete);
loader.load(request);
protected function handleComplete (event:Event):void {
var bytes:ByteArray = new ByteArray();
bytes.writeObject(event.target.data);
// dies on this line with "There was an error decompressing the data."
bytes.uncompress();
var xml:XML = new XML(new String(bytes));
trace(xml);
}