1

XMLデータをAS3で圧縮し、JavaのGoogle App Engineサーブレットで検証し、Google Cloud Storageのファイルに保存する必要があります。その後、そのファイルはAS3クライアントによって開かれ、解凍されます。プロセスは、単純なXMLやテキストで処理すると機能しますが、ByteArray#でデータを圧縮すると、ByteArray#で "データを解凍する際にエラーが発生しました"というメッセージが表示されます。バイナリデータをAS3からJava経由でファイルシステムに送信するにはどうすればいいですか?

コンテンツタイプと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サーブレットでそれを受信して​​、ファイルの作成:ここで

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); 
} 
+0

解凍を解除する前にtry bytes.position = 0と入力してください。 –

+0

ありがとうございましたが、助けませんでした。私は、圧縮の直後に、そして復元の直前に、バイトの値を印刷しようとしました。半分のシンボルが疑問符に置き換えられました。エンコードされている必要がありますか? –

+0

おそらく、私は、サーバーに送信されているデータを見て(httpfox)、返されているものと比較します。 –

答えて

0

:AS3に新しいファイルを開く

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

を私はxmlを保存するために使用するコードです。私はPHPにデータを送信しますが、私はあなたのために同じように動作すると思います...私はそれに何の問題はありませんでした。

var createXMLURL:URLRequest = new URLRequest("createXML.php"); 
createXMLURL.method = URLRequestMethod.POST; 
var Variables:URLVariables = new URLVariables(); 
Variables.xmlString = xml.toXMLString(); 
Variables.filename = filename; 
createXMLURL.data = Variables; 
var loader:URLLoader = new URLLoader(); 
loader.dataFormat = "VARIABLES"; 
loader.addEventListener(Event.COMPLETE, xmlCreated); 
loader.load(createXMLURL); 

あなたは、私が彼らの宣言を(私は彼らが把握するのは簡単だと思う)が含まれていなかったので、いくつかの変数が何であるかについて質問があるなら、私に教えてください。

これはあなたが求めていたようにバイナリ形式でデータを送信しませんが、本当に必要な場合は、Javaで文字列を受け取った後で文字列をバイナリに変換できない理由はわかりません生のバイト

+0

これは私のコードで圧縮を取り除いたものです。私が言及したように、それは正常に動作します - それは私が問題を抱えているバイナリ形式で送信しています。 –

0

クライアントからPOSTの場合はbase64エンコードを行い、TextProertyにそのように格納してから、クライアントで受信したときにbase64デコード/デコンプレッションを行います。 GAEにバイナリとして保存する場合は、base64でBlobにデコードします。ここでは、あなたのコードを使ってまとめたコードスニペットと、HttpServiceを使って似たようなものを紹介します。 HTH。

private var _serviceHttp:HTTPService = new HTTPService; 

private function postBytes():void { 
    var xml:XML = <contents><thing>value</thing></contents>; 
    var bytes:ByteArray = new ByteArray(); 
    bytes.writeObject(xml); 
    bytes.position = 0; 
    bytes.compress(); 
    var enc:Base64Encoder = new Base64Encoder(); 
    enc.encodeBytes(bytes, 0, bytes.length); 
    var myObj:Object = new Object(); 
    myObj["bytes"] = enc.toString(); 
    // myObj["other_variables"] = your_other_varaibles; 
    _serviceHttp.method = "POST"; 
    _serviceHttp.resultFormat = "flashvars"; 
    _serviceHttp.url = your_url_here; 
    _serviceHttp.addEventListener(ResultEvent.RESULT, urlHandler); 
    _serviceHttp.addEventListener(FaultEvent.FAULT, urlErrorHandler); 
    _serviceHttp.send(myObj); 
} 
+0

Base64(普通のバイナリよりコンパクトではありません)を追加すると、圧縮解除された文字列の先頭に余分な文字が入ります:_ "W " _新しいXML(new Stringバイト)) 'が誤ったXMLエラーで死んでしまう。 –

+0

Aha!最後に、 "W"のソースが見つかりました。これは 'bytes.writeObject(xml)'によって追加されたヘッダーです。代わりに 'bytes.writeUTFBytes(xml)'を使用すると、それは表示されません。 –

関連する問題