java - 如何通过 Java 将二进制数据从 AS3 发送到文件系统?

标签 java actionscript-3 google-app-engine servlets google-cloud-storage

我有 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);
}

最佳答案

这是我用来保存 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 中收到字符串,如果您确实需要的话,您将无法将其转换为二进制原始字节。

关于java - 如何通过 Java 将二进制数据从 AS3 发送到文件系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10096774/

相关文章:

java - 你能去掉这些 if 并使这段代码更加面向对象吗

javascript - 如何成功地将 AppWarp 集成到 ActionScript 3 代码中?

javascript - 在 Google App Engine 中使用 Jquery 按顺序加载图像

google-app-engine - 提高 ndb 查询大数据的吞吐量

java - Spring Boot 测试类可以重用应用程序上下文以更快地运行测试吗?

java - 遗传算法每次都会提供不同的输出吗?

java - 如何使用两种不同模型的两种方法?

apache-flex - 安全错误 : Error #2000: No active security context

java - 有 token_get_all 变体吗?

java - GAE 上生产应用程序的 Play 框架