2013-05-13 28 views
0

好吧,所以我有一个Android应用程序,图像到我的PHP Web服务。PHP的base64如何变成图像插入数据库

我使用base64_decode()解码了我的base64字符串。但是,当我执行SQL查询将数据插入数据库时​​,脚本会插入此字符串\x5265736f75726365206964202333

我想知道的是如何修改代码以将该字符串转换为图像并将其插入到PostgreSQL数据库中,该数据库具有UTF8编码和bytea数据列类型以存储图像。

PHP脚本

header('Content-Type: text/plain; charset=UTF-8'); 
$conn = pg_connect("database_string"); 

/* GET DATA */ 
$name = $_POST['name']; 
$s_name = pg_escape_string($name); 
$description = $_POST['desc']; 
$s_desc = pg_escape_string($description); 
$latitude = $_POST['lat']; 
$longitude = $_POST['lng']; 
$project = $_POST['project']; 

$encoded_photo = $_POST['snap']; 
$photo = base64_decode($encoded_photo); 
header('Content-Type: image/jpeg; charset=utf-8'); 
$file = fopen('uploaded_image.jpg', 'wb'); 
fwrite($file, $photo); 
fclose($file); 

/* INSERT INTO DATABASE */ 
$res = pg_query("INSERT INTO records (photo, name, description, latitude, longitude, project) VALUES ('$file', '$s_name', '$s_desc', '$latitude', '$longitude', '$project')"); 

我知道我接近我预期的解决方案。我想我插入解码的base64字符串,并插入,但错过了最后一步将其转换为Android应用程序采取的原始图像。对于我的android dev'ing的新颖道歉。

+0

'\ x5265736f75726365206964202333'为'Resource id#3' as text。所以我会说你没有获得自己的图像数据,但有一些在你的网络应用程序中处理它。 – 2013-05-13 04:59:17

+0

@CraigRinger我该如何利用这个句柄来查找图像数据本身? – WebDevDanno 2013-05-13 07:00:11

回答

0

我成功地使用HTML + mySql编写和调用base64图像。

说到在HTML5

下面是我对数据库

数据数据的例子:图像/ PNG; BASE64,iVBORw0KGgoAAAANSUhEUgAAApQA

你需要把数据:图像/ <图像格式(PNG在我的情况)>

因此,在页面中查看您需要添加 <img src=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAApQA />

我希望这可以应用到您的项目。

+0

我不想在这个特定的脚本中查看它,只是将图像插入到我的'bytea'列中。任何想法如何实现这一目标? – WebDevDanno 2013-05-13 06:59:30

1

这一部分:

$file = fopen('uploaded_image.jpg', 'wb'); 
fwrite($file, $photo); 
fclose($file); 

/* INSERT INTO DATABASE */ 
$res = pg_query("INSERT INTO records (photo, name, description, latitude, longitude, project) VALUES ('$file', '$s_name', '$s_desc', '$latitude', '$longitude', '$project')"); 

是没有意义的。你正在插入一个PHP文件句柄。它被PHP转换为像Resource id #3这样的字符串,然后转换为bytea。不是你想要的。

因为您已经将它存储在内存中,所以将数据写入文件是完全没有必要的。只要使用参数化查询(你应该总是使用参数化查询),并让DB驱动程序通过pg_query_params照顾它:

$res = pg_query_params(
     'INSERT INTO records (photo, name, description, latitude, longitude, project) VALUES ($1, $2, $3, $4, %6, $6)', 
     array(pg_escape_bytea($photo), $s_name, $s_desc, $latitude, $longitude, $project) 
); 

the docs on pg_query_params

关于bytea转义,请参见pg_escape_byteapg_unescape_bytea。请注意,这些功能相当落后于时间,并且可能无法在输出上正确识别hex换码;如果遇到问题,请在尝试将值提取到pg_unescape_bytea之前发出SQL命令SET bytea_output = 'escape';

什么PHP应该真的被使用的事实,查询的第一个参数的数据类型为bytea推断,它必须插入$photo为原始字节,而不是文本做。从你的评论看来,这听起来不够聪明。

顺便说一句,你真的需要阅读this website了解为什么参数化语句应该使用总是。见SQL Injectionthe PHP manual on SQL injection。除了更安全之外,参数化语句更容易正确并且通常更快。

+0

谢谢,但我得到了一个'无效的字节序列编码UTF8:0xff'我该如何解决这个问题? – WebDevDanno 2013-05-13 07:30:59

+0

@DanielD是的,当然; PHP没有'字节'的单独数据类型,所以'pg_query_params'不知道它必须十六进制转义数据。 PHP的PostgreSQL驱动相当落后,不支持十六进制转义,所以你需要'SET bytea_output = escape;'然后使用'pg_escape_bytea'。查看更新 – 2013-05-13 07:40:21

+0

好吧...只是为了检查这一切,是在我已经实现了这个代码'$ encoded_photo = $ _POST ['snap']; $ photo = base64_decode($ encoded_photo);'correct? – WebDevDanno 2013-05-13 07:47:57