好的,所以我有一个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开发新手的新见感到抱歉。
答案 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_bytea
和pg_unescape_bytea
。请注意,这些函数非常落后于时代,可能无法识别hex
在输出时正确转义;如果您遇到问题,请在尝试将值提取到SET bytea_output = 'escape';
之前发出SQL命令pg_unescape_bytea
。
PHP应该真正正在做的是使用查询的第一个参数的数据类型为bytea
的事实来推断它必须作为原始字节插入$photo
而不是比文字。从你的评论来看,这听起来不够聪明。
顺便说一句,你真的需要阅读this website来理解参数化语句应该总是使用的原因。请参阅SQL Injection和the PHP manual on SQL injection。除了更安全之外,参数化语句更容易正确且通常更快。
答案 1 :(得分:0)
我使用HTML + mySql成功编写并调用了base64图像。
在HTML5中讨论示例
以下是我的数据库数据
数据:图像/ PNG; BASE64,iVBORw0KGgoAAAANSUhEUgAAApQA
您需要输入数据:image /<图像格式(在我的情况下是png)>
因此,要在页面中查看,您需要添加
<img src=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAApQA
/&gt;
我希望这可以应用到您的项目中。