[PHP-MYSQL] Campos Blobs e Imagenes

TeKaNeO

Hola a todos:

Tengo un problema con este tipo de campos en la BD de Mysql. A ver, tengo un script que carga la foto en binario en la tabla de imagenes de la BD. Eso lo hace bien, el problema viene al hacer el efecto contrario, compilar el binario y traermela al navegador.

Al traermela, me salen o bien simbolos como que no la ha compilado o bien que existen errores en la imagen y que no se puede mostrar.

Estoy "jarto" de dar vueltas por inet y no se como arreglar ese problema xD ¿Puede ser tema del navegador? ¿no creo no? ¿Que no llega a meterse bien la imagen en el campo blob? Al hacer un select a la tabla se ve que se colocan bien los campos de nombre, tamaño y demas y en el de blob pues eso, salen simbolitos xD.

He revisado lo del tamaño de la imagen, uso mediumblob ( hasta 16 Megas ) asi que eso no es, ademas he activado el buffering a On en el php ini. ¿Alguien sabe que puede pasar y por qué me da este error?

Un saludo^^

r2d2rigo

Si pegas el codigo de la funcion para renderizar la imagen, mejor...

Estas SEGURO que estas llamando al < header content-type = "xxx/xxx" > para mostrar la imagen? Tu servidor soporta las PHP GDI? Mas datos please :P

TeKaNeO

A ver comento. La imagen la carga bien en la BD, hago un select a la tabla y sale como cargada. La imagen es una JPEG.

Parto de esta tabla:

CREATE TABLE archivos (
id int(10) unsigned NOT NULL auto_increment,
archivo_binario blob NOT NULL,
archivo_nombre varchar(255) NOT NULL default '',
archivo_tamano varchar(15) NOT NULL default '',
archivo_tipo varchar(25) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;

Lo que hago es lo siguiente:

<?php
if(isset($_GET['id'])){
$db = mysql_connect('localhost','administrador','admin');
mysql_select_db('shop',$db);
$query = "SELECT * FROM archivos WHERE id=1";
$result = mysql_query($query);
$datos = mysql_fetch_array($result);
$tipo = $datos[4];
$nombre = $datos[2];
$tamano= $datos[3];
header("Content-type: $tipo");
header("Content-length: $tamano");
header("Content-Disposition: inline;
filename=$nombre");
echo $datos[1];
}?>


Esto deberia imprimirme en pantalla la imagen ya que imprimo $datos[1] que es donde tengo el binario. El caso es que me da error en los headers al darle valor, el tipico que no puede enviar la informacion a la cabecera y tal.

Otra cosa que he pensado es poner esto:

Header("Content-type:image/jpeg");
$nueva=imagecreatefromstring($imagen);
imagejpeg($nueva);

pero me da error:

imagecreateformstring(): passed data is not in 'JPEG' format in

imagecreateformstring(): couldŽnt create gd image stream out of data

iamgepeg() supplied argument is not valid image resoursde in

He de decir que me sale el problema del header information y aparte me sale el codigo binario de la foto pero claro, simbolos a saco xD

La version del GD que uso es 2.0 . Otra cosa: decir que uso PHP version 4.40 y 4.1.13 bajo Suse Linux 10.0 .

¿Alguna sugerencia?

r2d2rigo

Pues es raro... en el primer metodo, prueba a enviar unicamente el header de content-type, lo demas dejalo como esta. Si sigue fallando sera un problema de la configuracion de tu PHP.

Doy por sentado que ese script estara en una pagina aparte, y la llamaras como src de un < img >, no?

TeKaNeO

Tengo 3 páginas PHP: el formulario de carga de la imagen a la BD, la que ve el thumbail en otra web (el script que comento) y otra que me indica el nº de imagenes con su caracteristicas cargadas en la BD.

No entiendo eso de que debe llamarse a traves de un src, ¿puedes explicarmelo un poco más? Se que las imagenes deben mostrarse a traves de un pero... ¿en este caso donde deberia poner este ? ¿No imprime directamente la imagen en el formulario a traves del echo $datos[1]? El problema es que al hacer imagejpeg($datos[1]) me da ese error, y claro, no puedo transformarla, e imagino que es por eso por lo que en vez de la imagen se me ve el código binario en si (simbolitos y demas en la web).

r2d2rigo

La imagen la tienes que tratar como un codigo aparte. Tu, al generar el JPG (o GIF, o PNG, cualquier imagen de GDI), necesitas llamar a sus headers propios (el content-type, para que el navegador lo interprete). El caso es que nunca puedes hacer una llamada a header por en medio de una pagina, asi que el metodo que yo siempre he usado (y que creo que mucha gente usa) es este:

generarimagen.php:
< ?php
// cargas los datos de la bd
// envias el header del content-type
// haces el echo con los datos binarios
? >

Si tu en tu barra de direcciones pones http://localhost/generarimagen.php?id=1 , te saldria una pagina que solo tendria el JPG, nada mas. Asi que para que se vea en otros lados, tienes que ponerla como src de un img:

tupagina.php:

< img src="generarimagen.php?id=1" />

Al principio cuesta de comprender, pero cuando lo veas, se te quedara para toda la vida :P

SeiYa

Es extraño que te pase, de todos modos, lo que te dice ahí es que la cadena que le pasas no es de un JPG puede que sea de un gif renombrado (muchas veces se hace)...

Por otra parte siempre es mejor no guardar la imagen entera en la BBDD porque da mucha más carga al sevidor.

Soltrac

Pregunta absurda y rediciendo lo q dice #7

No te compensa mas guardar el string con el link a la imagen en la BB.DD. que mejor la imagen en si? ^^

Usuarios habituales

  • Soltrac
  • SeiYa
  • r2d2rigo
  • TeKaNeO