我是在这里发帖的新手,所以请耐心等待。
问:如何通过 php 将存储为 blob 的图像作为 json 字符串传递?
情况:我有一个简单的慈善数据库,其中包含字段charity_id(int),charity_name(字符串),图片(blob)和其他几个字段。
我想用 php 获取 id、charity_name 和图片,并将数据作为 json 字符串传递给我的 android 应用程序,在那里它将使用 volley 库解析。
我一切正常并正确传递,除了我的图片字段传递 null 而不是字符串。
<?php
if($_SERVER['REQUEST_METHOD']=='GET'){
$id = $_GET['id'];
require_once('dbConnect.php');
$sql = "SELECT charity_id, charity_name,picture FROM charity_table WHERE charity_id = '".$id."'";
$r = mysqli_query($con,$sql);
$res = mysqli_fetch_array($r);
$result = array();
array_push($result,array(
"charity_id"=>$res['charity_id'],
"charity_name"=>$res['charity_name'],
"picture"=>$res['picture']
)
);
echo json_encode(array("result"=>$result));
mysqli_close($con);
}
传递的 JSON 值 {"result":[{"charity_id":"1","charity_name":"charity1","picture":null}]}
因为我对这个过程的理解(可能是错误的)是 php 从 sql 获取一个二进制字符串,然后将该字符串放入 json 数组中,然后 android 读取该数组并将二进制字符串转换为位图图像。
不是
将图像存储为 blob,而是可以在数据库中存储图像的引用路径,然后
从数据库返回一行
使用图像引用 URL,您可以根据需要将图像下载为具有异步调用的二进制块。
JSON 无法处理原始二进制数据,您需要以某种方式对其进行编码,而"如何"几乎是规范的 base64。
在服务器端使用它:
array_push($result,array(
"charity_id"=>$res['charity_id'],
"charity_name"=>$res['charity_name'],
"picture"=>base64_encode($res['picture'])
)
);
并在安卓端实现相关的base64解码。
也就是说,我同意关于这个问题的其他评论:
- 文件应存储在文件系统中,并且仅存储在数据库中的引用。
- 您可能应该通过单独的简单 HTTP 请求提供图像,而不是将其管道到 JSON 中。
- 值得注意的是,以文本安全的方式编码二进制数据总是会膨胀大小,对于 base64,它大约大 30%。
- 可以并行处理单独的请求。
如果您只是以这种方式存储和提供小图标或缩略图,那还不错,但是任何超过几kB的大小都将是战利品中的痛苦。