【发布时间】:2012-04-23 05:12:35
【问题描述】:
我在 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);
}
【问题讨论】:
-
也许在解压缩之前尝试 bytes.position = 0?
-
谢谢,但没有帮助。我尝试在压缩之后打印出字节的值,并在解压缩之前再次打印出 - 一半的符号已被问号替换。应该是编码吧?
-
可能,我会查看(httpfox)发送到服务器的数据并与发送回的数据进行比较。
-
一旦你运行压缩文件将不再是人类可读的。我能想到的一件快速的事情是尝试编写 xml 文件的字符串版本。 xml.toXMLString();
-
这是人类可读的足以告诉它已经改变了。之前:·ÉI-K?ãRP°)ÈI,IË/Ê-¶34µÑGð@r?å©Åù¹©y©ÅÅÅvF6úÈ\°Öü?0?3Ôª?0Q?ÍuL?IXZê#I@?@Cmô!n? 6= 之后:??IK??RP?)?I,I?/?-?34??G?@r???????y???vF6??\????0?3 ???0Q??uL?IXZ?#I@?@Cm?!n
标签: java actionscript-3 google-app-engine servlets google-cloud-storage