如何将带图像的字节数组从AS3发送到PHP?

如何将带图像的字节数组从AS3发送到PHP?,php,actionscript-3,flash,air,bytearray,Php,Actionscript 3,Flash,Air,Bytearray,我已经从AS3AIR应用程序发送了一个图像,以及其他的POST参数到PHP脚本,PHP脚本将完成其余的工作。我想以某种方式将带有图像的字节数组转换为字符串,并用base64对其进行编码。我成功了,但是图像数据是错误的 下面是我用来转换它的代码: ... //BA1 is Byte Array with an image in it var data:String = BA1.toString(); OutSql.push({t: "b1", v: Base64.encode(data)}); .

我已经从AS3AIR应用程序发送了一个图像,以及其他的POST参数到PHP脚本,PHP脚本将完成其余的工作。我想以某种方式将带有图像的字节数组转换为字符串,并用base64对其进行编码。我成功了,但是图像数据是错误的

下面是我用来转换它的代码:

...
//BA1 is Byte Array with an image in it
var data:String = BA1.toString();
OutSql.push({t: "b1", v: Base64.encode(data)});
...
一切正常,这些数据被发送到服务器,解码并存储为图像,但图像是错误的。不知怎的,它大约是40KB,而当我将它保存在Air应用程序中时,它是22KB。有什么想法吗

p、 我知道我可以在本地保存并上传,但我真的需要这样做。另外,BA1.readUTF()会生成一个错误,因此不是选项

添加


在服务器端,我尝试在写入文件之前对字符串进行utf8_解码,不知怎的,我得到了一个尺寸合适的图像,但是。。。那个图像不是我想要的,它看起来像是涂鸦…

Soultion发现的。我已经从Base64.swc下载,它实际上是编码和解码图像字节数组。因为我的字符串是JSON编码的(作为发送到PHP的对象的一部分),所以我只需将空格转换为“+”并对其进行解码和写入文件即可——非常好!案件已结案。

已找到解决方案。我已经从Base64.swc下载,它实际上是编码和解码图像字节数组。因为我的字符串是JSON编码的(作为发送到PHP的对象的一部分),所以我只需将空格转换为“+”并对其进行解码和写入文件即可——非常好!案件结案

import com.sociodox.utils.Base64;
.....
//BA1 is ByteArray with an image encoded
var enc_image=Base64.encode(BA1);
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.TEXT;
var request:URLRequest = new URLRequest("some.php");
var variables:URLVariables = new URLVariables();
variables.decode("image="+enc_image);
request.method = URLRequestMethod.POST;
request.data = variables;
loader.load(request);
当然,也要设置你的听众

在“some.php”中:

这就像一个符咒:)

当然,也要设置你的听众

在“some.php”中:


这就像一个符咒:)

是否
BA1
包含jpeg或png的数据,还是仅包含原始位图数据(用于
getPixels();
字节)?如果它已经是jpg/png,那么使用
Base64.encode(BA1)
,那么B64本身将从字节中获得一个编码字符串。无论如何,您的大小是40kb(从22kb开始),因为您使用了
toString
。考虑两个字节0xFF和0xD8(总大小是2),现在作为一个字符串,它是FFD8,它是总大小4。转化率是原来的两倍。如果可能,只需执行
跟踪(“字节为:”+BA1)然后在这里显示BA1字节的前8个字母。这样更容易评估格式…BA1包含jpeg数据。但是,尝试对BA1进行编码会产生错误,因为只能对字符串进行编码,而不能对字节数组进行编码。以下是跟踪的答案:
字节是:JFIFÿÛ
,它看起来像一个好的jpeg头。但其余的数据只是一团糟。顺便问一下,图像siye是正确的。为什么不以二进制形式发送图像呢?
BA1
是否包含jpeg或png的数据,或者仅包含原始位图数据(使用
getPixels();
表示字节)?如果它已经是jpg/png,那么使用
Base64.encode(BA1)
,那么B64本身将从字节中获得一个编码字符串。无论如何,您的大小是40kb(从22kb开始),因为您使用了
toString
。考虑两个字节0xFF和0xD8(总大小是2),现在作为一个字符串,它是FFD8,它是总大小4。转化率是原来的两倍。如果可能,只需执行
跟踪(“字节为:”+BA1)然后在这里显示BA1字节的前8个字母。这样更容易评估格式…BA1包含jpeg数据。但是,尝试对BA1进行编码会产生错误,因为只能对字符串进行编码,而不能对字节数组进行编码。以下是跟踪的答案:
字节是:JFIFÿÛ
,它看起来像一个好的jpeg头。但其余的数据只是一团糟。顺便说一下,图像siye是正确的。为什么不将图像作为二进制文件发送呢?
$imageData = base64_decode(str_replace(" ", "+", $_POST['image']));
$fh = fopen("path/to/image/somename.jpg", "wb");
fwrite($fh, $imageData);
fclose($fh);