2016-04-22 99 views
0

我已经从AS3 AIR应用程序发送一个图像,旁边的POST参数发送到PHP脚本,剩下的就完成了。我想以某种方式将字节数组与图像转换为字符串并使用base64进行编码。我是成功的,但图像数据是错误的。如何将图像从AS3发送到PHP的字节数组?

下面是我用它转换代码:

... 
//BA1 is Byte Array with an image in it 
var data:String = BA1.toString(); 
OutSql.push({t: "b1", v: Base64.encode(data)}); 
... 

一切正常,这个数据被发送到服务器,解码,并存储为图像,但图像是错误的。不知何故,它约为40 kb,而当我将它保存在Air应用程序中时,它是22 kb。有任何想法吗?

p.s.我知道我可以保存并上传它,但我真的需要这样做。此外,BA1.readUTF()生成一个错误,所以不是一个选项。

加成

在服务器端我写文件之前曾试图utf8_decode串,不知何故我得到的图像是正确的尺寸,但是......那个形象是不是我想要的是,它看起来像涂鸦...

+1

是否'BA1'包含jpeg或png的数据或只是原始位图数据(对于字节使用'getPixels();')?如果它已经jpg/png然后使用'Base64.encode(BA1)',那么B64本身会给你一个字节的编码字符串。无论如何,你的大小是40kb(从22kb)因为你使用了'toString'。考虑两个字节** 0xFF **和** 0xD8 **(总大小为2)现在作为字符串它是** FFD8 **这是总大小4。转换是两倍的大小。如果可能的话,只要做一个'trace(“字节是:”+ BA1);'然后在这里给我看BA1字节的前8个字母。更容易评估格式的方式... –

+0

BA1包含JPEG数据。然而,试图编码BA1会产生一个错误,因为只有字符串可以被编码,而不是字节数组。 –

+1

这里是回答的痕迹: '字节是:ÿØÿàJFIFÿÛ' 这看起来像一个很好的JPEG标题。但其余的数据只是搞砸了。顺便说一下,图片siye是正确的。 –

回答

3
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”:

$imageData = base64_decode(str_replace(" ", "+", $_POST['image'])); 
$fh = fopen("path/to/image/somename.jpg", "wb"); 
fwrite($fh, $imageData); 
fclose($fh); 

这就像一个魅力:)

1

发现Soultion。我已经从http://www.sociodox.com/base64.html下载了Base64.swc,它实际上是对图像Byte Arrays进行编码和解码。而且由于我的字符串是JSON-ed(作为发送给PHP的对象的一部分),我只需将空格转换为“+”并解码并写入文件 - 完美无缺!案件结案。