如何将带有图像的字节数组从 AS3 发送到 PHP?
Posted
技术标签:
【中文标题】如何将带有图像的字节数组从 AS3 发送到 PHP?【英文标题】:How to send byte array with image from AS3 to PHP? 【发布时间】:2016-08-16 07:24:04 【问题描述】:我已经从 AS3 AIR 应用程序发送图像,除了 POST 参数的其余部分之外,php 脚本将完成其余的工作。我想以某种方式将带有图像的字节数组转换为字符串并用base64对其进行编码。成功了,但是图片数据有误。
这是我用来转换它的代码:
...
//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。有什么想法吗?
附言我知道我可以将它保存在本地并上传,但我真的需要这样做。此外,BA1.readUTF() 会产生错误,因此不是一个选项。
加法:
在服务器端,我尝试在写入文件之前对字符串进行 utf8_decode,但不知何故,我得到了一个尺寸合适的图像,但是......那个图像不是我想要的,它看起来像涂鸦......
【问题讨论】:
BA1
是否包含 jpeg 或 png 的数据或仅包含原始 bitmapData(使用 getPixels();
表示字节)?如果它已经是 jpg/png 然后使用 Base64.encode(BA1)
那么 B64 本身会给你一个来自字节的编码字符串。无论如何,您的大小是 40kb(从 22kb)因为您使用了toString
。现在考虑两个字节 0xFF 和 0xD8(总大小为 2)作为字符串,它是 FFD8,总大小为 4。转换加倍规模。如果可能的话,只做一个trace ("bytes are : " + BA1);
然后在这里给我看 BA1 字节的前 8 个字母。这样更容易评估格式...
BA1 包含 jpeg 数据。但是,尝试编码 BA1 会产生错误,因为只能编码字符串,不能编码字节数组。
这里是跟踪的答案:bytes are : ÿØÿàJFIFÿÛ
看起来像一个不错的 jpeg 标头。但是其余的数据只是一团糟。顺便说一句,图像 siye 是正确的。
为什么不将图像作为二进制发送?
【参考方案1】:
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);
当然,也要设置你的听众……
在“一些.php”中:
$imageData = base64_decode(str_replace(" ", "+", $_POST['image']));
$fh = fopen("path/to/image/somename.jpg", "wb");
fwrite($fh, $imageData);
fclose($fh);
这就像一个魅力:)
【讨论】:
【参考方案2】:找到了解决方案。我从http://www.sociodox.com/base64.htmlBase64.swc 下载,它实际上是对图像字节数组进行编码和解码。而且因为我的字符串是 JSON 格式的(作为发送到 PHP 的对象的一部分),我只需要将空格转换为 '+' 并将其解码并写入文件 - 完美无缺!结案。
【讨论】:
以上是关于如何将带有图像的字节数组从 AS3 发送到 PHP?的主要内容,如果未能解决你的问题,请参考以下文章
如何将带有字节数组的 json 发送到 web api / postman
将数组从 Flash (AS3) 发送到 JavaScript