0

好的,所以我有一个 android 应用程序,它是我的 php web 服务的图像。

我已经使用base64_decode(). 但是,当我执行 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 的新奇感到抱歉。

4

2 回答 2

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)
);

请参阅上的文档pg_query_params

关于 bytea 逃逸,请参见pg_escape_byteapg_unescape_bytea。请注意,这些功能已经落后于时代,并且可能无法hex在输出时正确识别转义;如果您有问题,请SET bytea_output = 'escape';在尝试将值提取到pg_unescape_bytea.

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

顺便说一句,你真的需要阅读这个网站来理解为什么应该总是使用参数化语句的原因。请参阅SQL 注入和有关 SQL 注入的 PHP 手册。除了更安全之外,参数化语句更容易正确且通常更快。

于 2013-05-13T07:08:38.080 回答
0

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

讲 HTML5 中的例子

以下是我在数据库中的数据

数据:图像/png;base64,iVBORw0KGgoAAAANSUhEUgAAApQA

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

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

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

于 2013-05-13T04:06:13.383 回答