php subir, - Extracción de datos de imagen BLOB de MySQL en PHP




2 Answers

Puede almacenar imágenes en su base de datos si lo desea (aunque tampoco tiene nada de malo almacenarlas como archivos, elija lo que sea apropiado en su situación), pero almacene los datos binarios en bruto en un BLOB (es decir, no los codifique con base64). Puede insertar los datos binarios que obtiene de file_get_contents en su consulta directamente, siempre que utilice primero la función de escape adecuada ( mysql_real_escape_string en su caso).

En cuanto a la salida de la imagen, puede hacerlo de la manera que lo está haciendo ahora mismo, pero tendrá que producirla codificada en base64 y con un esquema de URI de data como este:

echo '<img alt="embedded image" src="data:image/png;base64,' . chunk_split(base64_encode($get_pics2['img_location'])) . '">';

Tenga en cuenta que hay algunas ventajas y desventajas de los datos de imagen integrados. Algunas desventajas importantes a tener en cuenta son la sobrecarga grave de la codificación base64 (alrededor de un 33% más grande que la original) y los posibles problemas de almacenamiento en caché.

mostrar, imágenes

Estaba leyendo algunos tutoriales sobre cómo cargar mi imagen en el DB como un binario opuesto a ponerlos en el servidor, así que lo hice funcionar así:

PHP:

$image = chunk_split(base64_encode(file_get_contents($tmpfile)));
    mysql_query("INSERT INTO images (`img_location`, `caption`, `user`, `genre`, `when`) VALUES ('$image', '$caption', '$id', '$genre', '$when')");

Mi problema es cómo sacarlo ahora de la base de datos, he leído varias maneras de hacerlo, intenté todos, no puedo entenderlo, no estoy obteniendo un error de MySQL, así es como lo estoy intentando :

$get_pics = mysql_query("SELECT * FROM images WHERE user='$id' ");
while($get_pics2 = mysql_fetch_array($get_pics))
{
$sixfour_enc = base64_decode($get_pics2['img_location']);

$new .= "<img src=\"".$sixfour_enc."\" >";
}

Esto funciona ... más o menos, lo que está sucediendo es que está imprimiendo binario en bruto en la etiqueta IMG.

¿Cómo hago esto para compilar a una imagen readible otra vez? Además, ¿es estúpido almacenar las imágenes en la base de datos? ¿Debo hacer lo que suelo hacer y almacenarlos en el servidor?

Gracias, Mike




En realidad, el mejor enfoque es tener un script PHP para generar el binario de la imagen con encabezados adecuados (digamos getimage.php) y el script usado para generar el HTML tendrá un código como este:

$get_pics = mysql_query("SELECT id FROM images WHERE user='$userid' ");
while($imglist = mysql_fetch_array($get_pics))
{
    $new .= '<img src="getimage.php?id='.$imglist['id'].'" title="'.$imglist['caption'].'" />';
}

Entonces el HTML se verá así:

<img src="getimage.php?id=12345" title="the caption of" />

Debe tener una clave principal (¿por qué no ya?) En las images la tabla, digamos id .

El script " getimage.php " extraerá el binario y generará el contenido (suponiendo que el campo img_location contiene el contenido real de la imagen:

<?php
// this will output the RAW content of an image with proper headers
$id=(int)$_GET['id'];

$get_img = @mysql_fetch_assoc(@mysql_query("SELECT img_location FROM images WHERE id='$id' "));

$image = imagecreatefromstring(base64_decode($get_img['img_location']));
if ($image){
    //you may apply here any transformations on the $image resource
    header("Content-Type: image/jpeg"); //OR gif, png, whatever
    imagejpeg($image,null,75);          //OR imagegif, imagepng, whatever, see PHP doc.
    imagedestroy($image);               //dump the resource from memory
}
exit();
@mysql_close();
?>

Este enfoque te dará flexibilidad. Sin embargo, es posible que deba verificar y desinfectar las variables y elegir otro método de conexión a MySQL, como MYSQLi o PDO. Otra buena idea es el uso de declaraciones preparadas para evitar inyecciones de SQL.




Related

php mysql binary blob