代码之家  ›  专栏  ›  技术社区  ›  menkes

在php页面中作为img-src的Oracle blob

  •  5
  • menkes  · 技术社区  · 15 年前

    我有一个站点当前使用文件服务器上的图像。图像显示在一个页面上,用户可以根据需要拖放每个图像。这是通过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;
    

    但我需要[有效地]得到图像作为img标签的src属性。我尝试了imageCreateFromString(),但这只是在浏览器中返回图像,忽略了其他HTML。我查看了数据URI,但IE8大小限制排除了这一点。

    所以现在我有点困了。我的搜索继续使用一个SRC属性来加载另一个包含图像的页面。但我需要图像本身实际显示在页面上。(注:我说的是图像,意思是至少一个图像,但一页最多八个)。

    任何帮助都将不胜感激。

    5 回复  |  直到 7 年前
        1
  •  7
  •   ircmaxell    15 年前

    嗯,你可以做一些事情。您可以创建一个将呈现图像的页面

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

    该image.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); ?>" />
    
        2
  •  4
  •   Pekka    15 年前

    但是我需要[有效地]得到图像作为img标签的src属性

    正如拜伦已经说过的,被接受和正确的方法是将blob输出到独立的映像资源中,并使用 img 标签。这是唯一的好方法。你可以使用 data: URIs 但他们

    1. 增加HTML代码
    2. 不在IE<8工作,并且 limited to 32 KB in IE 8 ,
    3. 将数据量扩大33%,并且
    4. 去掉浏览器缓存图像资源的可能性。

    几乎没有一个好的选择。

        3
  •  3
  •   Byron Whitlock    15 年前

    通常的方法是 <img src=/path/to/script?id=32> 字段。它将显示在页面上,而不是作为链接。这有什么问题?是否要将图像数据嵌入HTML?

    为了提高效率,可以实现某种类型的缓存,即将图像数据写入文件并执行 header(location...) 如果找到它而不是再次查询数据库。也 browser caching headers 应该设置为浏览器在本地缓存图像时不会下载图像。

        4
  •  1
  •   Serty Oan    15 年前

    您可以尝试以下操作:

    $img = $row['IMAGE']->load();
    print('<img src="data:image/png;base64,'.base64_encode($img).'" />');
    
        5
  •  0
  •   user3129243    9 年前
    <?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);
    ?>
    
    推荐文章