发送和接收编码为 php mysql BLOB 的 PNG

Sending and Recieving PNGencoded to php mysql BLOB

我正在尝试将位图图像的编码数据发送到服务器并返回到(或单独的)客户端。可能有一种更简单的方法可以用套接字或其他东西来做到这一点,但我是一个非常随意而且仍然是一个非常新的程序员而且我很难理解其他方法。编码和解码工作正常,我可以保存和打开编码的 png,但在 php/mysql 一侧的某个地方,编码数据丢失了大部分代码。

用于将编码数据发送到 php 的 Actionscript 代码。

var req:URLRequest = new URLRequest("http://host.net//img.php");
req.method = URLRequestMethod.POST;
var loader:URLLoader = new URLLoader;
var phpvar = new URLVariables();

var shape:MovieClip = new MovieClip();
shape.graphics.beginFill(0xFF0000);
shape.graphics.drawRect(0, 0, 100, 100);
addChild(shape);
var bmp:BitmapData = new BitmapData(500, 350);
bmp.draw(shape);

var byte:ByteArray = new ByteArray();
bmp.encode(new Rectangle(0,0, 100, 100), new flash.display.PNGEncoderOptions(false), byte);

//save on database
phpvar.bytez = byte;
req.data = phpvar;
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.load(req);

trace(req.data.bytez);

跟踪输出为:

PNG

->

IHDRddÿIDATxÚíÐ1 µçYÁÏ"Ð)®F,Y²dɒ¥@,Y²dÉR K,Y²d)%K,Y²Ȓ%K,Y dɒ%K,²dɒ%KY²dɒ%K,Y²dɒ¥@,Y²dÉR K,Y²d)%K,Y²Ȓ%K,Y dɒ%K,²dɒ%KY²dɒ%K,Yß^Çjú··IEND®B`

用于接收数据的 Actionscript 代码:

var req = new URLRequest("http://host.net//imgsend.php");
var loader = new URLLoader(req);


loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, onComplete);
loader.load(req);



function onComplete(e:Event) {
    var loaderer:Loader = new Loader();
    var byte:ByteArray = new ByteArray()

    byte = e.target.data;
    trace(byte);
}

跟踪输出为:

PNG

->

出于某种原因,它知道编码数据是用于 PNG 的,但只有 header。我认为问题出在我的 php/mysql 代码中,但我在这里并不完全确定。为方便起见,我使用带有 phpMyAdmin 的免费虚拟主机服务,图像 table 只是一个 BLOB 列,php 文件上传到主机服务器上。

PHP 读取和插入 mysql 的代码 (img.php)

<?php
mysql_connect($mysql_host, $mysql_user, $mysql_password);

mysql_select_db($mysql_database) or die(mysql_error());


$pic = $_POST['bytez'];


$sql = "INSERT INTO Images (img) VALUES ('$pic')";

mysql_query($sql);
?>

PHP 从服务器获取数据并将其发送到 Actionscript 的代码 (imgsend.php)

<?php
mysql_connect($mysql_host, $mysql_user, $mysql_password);

mysql_select_db($mysql_database) or die(mysql_error());




$sql = "SELECT * FROM Images";

$records = mysql_query($sql);

while($byte=mysql_fetch_assoc($records)){

    echo $byte['img'];

}

?>

我不一定找到这个确切方法的答案,但我找到了另一种解决方案,即将文件直接写入目录。从我读过的内容来看,无论如何这要有效得多。代码基本相同,只是我添加了 URLcontentType 并扩展了 URL 文件位置的 URL 请求地址。

var req:URLRequest = new URLRequest("http://host.net//img.php?filename=something.png");
req.method = URLRequestMethod.POST;
req.contentType = "application/octet-stream";

var loader:URLLoader = new URLLoader;


var shape:MovieClip = new MovieClip();
shape.graphics.beginFill(0xFF0000);
shape.graphics.drawRect(0, 0, 100, 100);
addChild(shape);
var bmp:BitmapData = new BitmapData(500, 350);
bmp.draw(shape);

var byte:ByteArray = new ByteArray();
bmp.encode(new Rectangle(0,0, 100, 100), new flash.display.PNGEncoderOptions(false), byte);

//save on database
req.data = byte;
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.load(req);

PHP 代码是 img.php 是:

<?php

   $fileName = $_GET['filename'];

   $fp = fopen( $fileName, 'wb' );

   fwrite( $fp, $GLOBALS['HTTP_RAW_POST_DATA'] );    

   fclose( $fp );

?>

加载文件很简单,不打算发布了。我将自己处理唯一的文件名,婴儿步骤。谢谢你帮我解决这个问题!