将ActionScript JPG字节数组传递给Javascript(最终传递给PHP)

将ActionScript JPG字节数组传递给Javascript(最终传递给PHP),javascript,actionscript-3,bytearray,jpeg,google-gears,Javascript,Actionscript 3,Bytearray,Jpeg,Google Gears,我们的web应用程序有一个功能,它使用Flash(AS3)使用用户的web cam拍摄照片,然后将生成的字节数组传递给PHP,在PHP中重建并保存在服务器上 然而,我们需要能够使这个web应用程序离线,我们已经选择Gears来实现这一点。用户将应用程序脱机,执行任务,然后当他重新连接到服务器时,我们将数据“同步”回我们的中央数据库 我们不再使用PHP与Flash交互,但我们仍然需要允许用户拍摄和保存照片。我们不知道如何保存Flash在本地数据库中创建的JPG。我们希望能够保存字节数组、序列化字符

我们的web应用程序有一个功能,它使用Flash(AS3)使用用户的web cam拍摄照片,然后将生成的字节数组传递给PHP,在PHP中重建并保存在服务器上

然而,我们需要能够使这个web应用程序离线,我们已经选择Gears来实现这一点。用户将应用程序脱机,执行任务,然后当他重新连接到服务器时,我们将数据“同步”回我们的中央数据库

我们不再使用PHP与Flash交互,但我们仍然需要允许用户拍摄和保存照片。我们不知道如何保存Flash在本地数据库中创建的JPG。我们希望能够保存字节数组、序列化字符串,或者以某种方式实际保存对象本身,然后将其传递回PHP或Flash(然后是PHP)以重新创建JPG

我们已尝试: -将字节数组传递给Javascript而不是PHP,但Javascript似乎无法对其执行任何操作(该对象似乎被剥夺了其方法) -在Flash中字符串化字节数组,然后将其传递给Javascript,但我们总是得到相同的字符串:

ÿØÿà
现在我们正在考虑在Flash中序列化字符串,将其传递给Javascript,然后在返回路径上,将该字符串传递回Flash,然后Flash将其传递给PHP以重构为JPG。(呼)。由于我们团队中没有人拥有丰富的Flash背景,我们有点迷路了


序列化是一条路吗?有没有更现实的方法?有人有过这方面的经验吗?也许我们可以构建一个javascript类,该类与as?中的字节数组类相同。

我不确定您为什么要在这里使用javascript。无论如何,您粘贴的字符串看起来像JPG头的开头。问题是JPG肯定会包含NUL(值为0的字符)。这很可能会截断字符串(就像您发布的示例一样)。如果您想“字符串化”JPG,标准方法是将其编码为base64

但是,如果您想在本地持久化数据,有一种方法可以在Flash中实现。这很简单,但也有一些局限性

您可以使用本地服务器进行此操作。默认情况下,有一个100KB的限制,这是相当不够的图像文件;不过,你可以要求用户为你的应用程序分配更多空间。在任何情况下,我都会尝试将图像存储为JPG,而不是原始像素,因为大小的差异非常显著

共享对象将透明地为您处理序列化/反序列化。这里有一些警告:不是每个对象都可以真正序列化;首先,它必须有一个无参数构造函数;显示对象,如精灵、电影嘴唇等,将无法工作。但是,可以序列化ByteArray,这样就可以在本地保存JPG(如果用户允许额外的空间)。您应该使用AMF3作为编码方案(我认为这是默认方案);此外,还应该映射要序列化的类以保留序列化对象的类型(否则它将被视为对象)。在应用程序生命周期中只需执行一次,但必须在对共享对象进行任何读/写操作之前执行

大致如下:

registerClassAlias(“flash.utils.ByteArray”,ByteArray)

我会使用共享对象而不是Javascript。请记住,您很可能需要要求用户为您提供更多存储图像的空间(如果您允许图像脱机工作,这似乎足够合理),并且用户可以随时删除数据(就像他可以删除浏览器的cookie一样)

编辑

我意识到我没有太注意你问题中的“我们已经选择了这样做的齿轮”部分


在这种情况下,您可以尝试使用base 64方法将数据传递给JS。从Actionscript的角度来看,这很容易(从众多可用的Base64编码器/解码器中挑选一个),我假设Gear的API必须已经有一个可用的编码器/解码器(或者至少应该不难找到)。在这一点上,您可能必须将其转换为Blob并将其存储到磁盘(可能使用,但我不确定,因为我没有齿轮方面的经验)

你的应用真的需要在浏览器中运行吗?使用AIR,您可以让应用程序在用户操作系统中以本机方式运行,并在本地保存文件,以便稍后上载/同步,或者将其保存为SQLite数据库中的blob。我知道这可能是构建过程中的一个重大变化,这就是为什么我会发表评论,而不是将其作为答案;-)你说得对,应用程序不需要在浏览器中运行,但是在线版本已经编写并运行了。此外,应用程序的其余部分(照片只是一小部分)已经移植,工作正常。事实上,我们不想为了一个功能而将整个应用程序移动到空中。