在PHP页面中使用Oracle Blob作为img src

5

我有一个网站,目前使用文件服务器上的图片。这些图片会出现在一个页面上,用户可以根据需要拖放每个图片。这是通过jQuery完成的,图片被包含在列表中。每个图片都很标准:

<img src='//network_path/image.png' height='80px'>

现在,我需要引用存储在Oracle数据库中的BLOB格式图像(无选择余地,因此不是优点讨论)。使用以下内容检索BLOB并单独显示没有问题:
$sql = "SELECT image FROM images WHERE image_id = 123";
$stid = oci_parse($conn, $sql);
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS);
$img = $row['IMAGE']->load();
header("Content-type: image/jpeg");
print $img;

但我需要以[src]属性的形式高效获取该图像。我尝试使用imagecreatefromstring(),但它只返回浏览器中的图像,忽略其他HTML。我看了数据URI,但IE8的大小限制规则使其不可行。
所以现在我有点卡住了。我的搜索结果都是使用[src]属性加载包含图像的另一个页面。但我需要图像本身实际显示在页面上。(注:我说的是图像,至少一个图像,但一个页面上最多可以有八个)。任何帮助将不胜感激。
5个回答

7

你可以做几件事情。你可以创建一个页面来渲染图像。

<img src="image.php?id=123" />

图像.php页面将包含以下内容:

$sql = "SELECT image FROM images WHERE image_id = " . (int) $_GET['id'];
$stid = oci_parse($conn, $sql);
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS);
if (!$row) {
    header('Status: 404 Not Found');
} else {
    $img = $row['IMAGE']->load();
    header("Content-type: image/jpeg");
    print $img;
}

或者,您可以将其base64编码到src中(注意,并非所有浏览器都处理得好):

<img src="data:image/jpeg;base64,<?php echo base64_encode($img); ?>" />

非常正确,谢谢。我最初尝试了这个方法,但无法使其工作。问题不在于方法,而是在脚本URL中传递了错误的变量名。再次感谢。 - menkes

4

但是我需要以标签的src属性的形式[高效地]获取该图像

正如Byron所说,被接受并且正确的方法是将blob输出为一个独立的图像资源,并使用标签嵌入它。这是唯一好的方法。你可以使用data: URIs,但是它们

  1. 使你的HTML代码臃肿
  2. 在IE < 8中不起作用,并且在IE 8中限制为32 KB,
  3. 扩大数据量33%,并且
  4. 剥夺了浏览器缓存图像资源的可能性。

几乎从来不是一个好选择。


3
这个问题的普遍解决方式是使用<img src=/path/to/script?id=32>字段,它会显示在页面上而不是链接。这个方式有什么问题吗?你想将图像数据嵌入HTML中吗?
为了使其更有效率,你可以实现某种类型的缓存,即将图像数据写入文件,并且如果找到它,则使用header(location...)而不是再次查询数据库。此外,应该设置浏览器缓存头部,以便浏览器如果已经本地缓存了图像,则不需要下载它。

1
你可以尝试这个:
$img = $row['IMAGE']->load();
print('<img src="data:image/png;base64,'.base64_encode($img).'" />');

0
<?php
if(isset($_POST['']))//get the id
$roll_no=$_POST[''];
$conn = oci_connect("", "", "");//DB connection
$query = 'SELECT image FROM TABLE where id=:id';
$stmt = oci_parse ($conn, $query);
oci_bind_by_name($stmt, ':id', $id);
oci_execute($stmt);
$arr = oci_fetch_array($stmt, OCI_ASSOC);
$result = $arr['image']->load();
header("Content-type: image/JPEG");
echo $result;
oci_close($conn);
?>

最好为你的答案添加解释。 - Gustavo Morales

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接