2010-06-16 20 views
5

Tengo un sitio que actualmente usa imágenes en un servidor de archivos. Las imágenes aparecen en una página donde el usuario puede arrastrar y soltar cada una según sea necesario. Esto se hace con jQuery y las imágenes se incluyen en una lista. Cada imagen es bastante estándar:Oracle Blob como img src en la página de PHP

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

Ahora, sin embargo tengo que hacer referencia a las imágenes almacenadas como un BLOB en una base de datos Oracle (sin elección en esto, así que no hay discusión mérito). No tengo ningún problema al recuperar el BLOB y mostrar por sí mismo usando:

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

Pero necesito [eficiente] conseguir que la imagen como el atributo src de la etiqueta img. Probé imagecreatefromstring() pero eso solo devuelve la imagen en el navegador, ignorando el otro html. Miré el uri de datos, pero el límite de tamaño de IE8 lo descarta.

Así que ahora estoy algo atrapado. Mis búsquedas siguen apareciendo con el uso de un atributo src que carga otra página que contiene la imagen. Pero necesito que la imagen en sí se muestre en la página. (Nota: digo imagen, que significa al menos una imagen, pero hasta ocho en una página).

Cualquier ayuda sería muy apreciada.

Respuesta

7

Bueno, puede hacer algunas cosas. Usted puede hacer una página que va a representar la imagen

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

Esa página image.php tendría esto:

$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; 
} 

O bien, puede codificar base 64 en el src (nota, no todos los navegadores manejar esto también):

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

Muy bien, gracias. Intenté esto inicialmente y no pude hacerlo funcionar. El problema no era el enfoque, solo se pasaba un nombre de variable incorrecto en la url del script. Nuevamente, gracias. – menkes

3

La forma normal de hacerlo es con un campo <img src=/path/to/script?id=32>. Aparecerá en la página no como un enlace. Cual es el problema con esto? ¿Deseas incrustar los datos de imagen en HTML?

Para hacerlo más eficiente, puede implementar algún tipo de almacenamiento en caché, es decir, escribir los datos de imagen en un archivo y hacer un header(location...) si lo encuentra en lugar de consultar el db nuevamente. También se debe configurar el browser caching headers para que el navegador no descargue la imagen si la tiene en caché localmente.

1

Usted puede intentar esto:

$img = $row['IMAGE']->load(); 
print('<img src="data:image/png;base64,'.base64_encode($img).'" />'); 
4

Pero necesito [eficiente] conseguir que la imagen como el atributo src de la etiqueta img

Como Byron ya dice, la forma correcta y aceptada es generar el blob en un recurso de imagen independiente e incrustarlo utilizando una etiqueta img. Es la única buena manera. Puede utilizar data: URIs pero

  1. engordar su código HTML
  2. no funcionan en IE < 8 y son limited to 32 KB in IE 8,
  3. expanda el volumen de datos en un 33%, y
  4. quitarle la década de Brower posibilidad de almacenar en caché el recurso de imagen.

Casi nunca es una buena opción.

+0

+1 en el crecimiento del volumen de datos en base64. –

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); 
?> 
+0

Es mejor agregar una explicación para su respuesta. –