AS3 の XML データを圧縮し、Java Google App Engine サーブレットで検証してから、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 サーブレットでそれを受け取り、ファイルを作成します。
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);
}