1

Ich habe XML-Daten in AS3, die komprimiert, auf meinem Java Google App Engine-Servlet validiert und dann in einer Datei in Google Cloud Storage gespeichert werden müssen. Später wird diese Datei vom AS3-Client geöffnet und dekomprimiert. Der Prozess funktioniert, wenn ich es mit einfachem XML oder Text mache, aber wenn ich ByteArray # die Daten komprimiere, stirbt es während ByteArray # dekomprimiert mit "Es gab einen Fehler beim Dekomprimieren der Daten".Wie kann ich Binärdaten von AS3 über Java an ein Dateisystem senden?

Ich habe versucht, den Inhaltstyp und Mime-Typ an verschiedenen Punkten, sowie die Codierung mit Base64, aber jeder Versuch scheint auf eine andere Weise zu brechen und ich bekomme nie die gleiche XML zurück, die ich gesendet habe Ich muss mehrteilig verwenden? Sollte ich auf dem Server komprimieren? Was ist die beste Vorgehensweise dafür?

Senden der Daten von 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); 

es im Servlet Java Empfangen und Erstellen der Datei:

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

die neue Datei in AS3 Öffnungs:

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

vielleicht versuchen bytes.position = 0, bevor Sie dekomprimieren? –

+0

Danke, aber hat nicht geholfen. Ich habe versucht, den Wert der Bytes direkt nach dem Komprimieren und erneut kurz vor dem Dekomprimieren auszudrucken - die Hälfte der Symbole wurde durch Fragezeichen ersetzt. Muss die Codierung sein, oder? –

+0

möglicherweise würde ich (httpfox) auf die Daten sehen, die an den Server gesendet werden und vergleichen mit, was zurückgeschickt wird. –

Antwort

0

Hier ist der Code, den ich verwende, um ein XML zu speichern. Ich sende die Daten an PHP, aber ich würde denken, es würde genauso funktionieren für Sie ... Ich hatte keine Probleme damit.

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

Lassen Sie mich wissen, wenn Sie Fragen zu haben, was einige der Variablen, da ich nicht ihre Erklärungen sind (ich glaube, sie sind ziemlich einfach herauszufinden).

Nun sendet dies nicht die Daten im Binärformat, wie Sie gefragt haben, aber ich weiß nicht, warum Sie nicht in der Lage, die Zeichenfolge in binäre konvertieren, sobald Sie es in Java erhalten, wenn Sie wirklich brauchen die rohen Bytes.

+0

Dies ist nur mein Code mit der Komprimierung herausgenommen. Wie gesagt, das funktioniert gut - es sendet im Binärformat, mit dem ich ein Problem habe. –

0

Ich würde Base64 codieren, bevor Sie POST, wenn vom Client, speichern Sie es in einer TextProerty, dann base64 dekodieren/dekomprimieren, wenn wieder auf dem Client empfangen. Wenn Sie es auf GAE als Binärdatei speichern möchten, dekodiert base64 es in einen Blob. Hier sind einige Code-Schnipsel, die ich mit Ihrem Code zusammengefügt habe, und etwas Ähnliches, das ich mit HttpService verwende - Entschuldigung im Voraus, um es nicht umfassend zu prüfen. 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

Wenn ich Base64 (die weniger kompakt als normale Binärdatei ist) hinzufüge, erhalte ich am Anfang der dekomprimierten Zeichenfolge zusätzliche Zeichen: _ "W Wert" _ also der Aufruf von 'new XML (new String (Bytes)) 'stirbt mit einem fehlerhaften XML-Fehler. –

+0

Aha! Schließlich habe ich die Quelle dieses "W" gefunden, es ist eine Art Header, der von "bytes.writeObject (xml)" hinzugefügt wurde. Wenn ich stattdessen 'bytes.writeUTFBytes (xml)' verwende, erscheint es nicht. –