PHP base64如何转换成图像以插入数据库

时间:2013-05-13 03:36:43

标签: php android postgresql base64

好的,所以我有一个Android应用程序,我的php网络服务的图像。

我使用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开发新手的新见感到抱歉。

2 个答案:

答案 0 :(得分: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。不是你想要的。

首先将数据写入文件是完全没有必要的,因为您已经将数据存储在内存中。只需使用参数化查询(您应始终使用参数化查询)并让数据库驱动程序通过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在输出时正确转义;如果您遇到问题,请在尝试将值提取到SET bytea_output = 'escape';之前发出SQL命令pg_unescape_bytea

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

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

答案 1 :(得分:0)

我使用HTML + mySql成功编写并调用了base64图像。

在HTML5中讨论示例

以下是我的数据库数据

  

数据:图像/ PNG; BASE64,iVBORw0KGgoAAAANSUhEUgAAApQA

您需要输入数据:image /<图像格式(在我的情况下是png)>

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

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