Duda Php que no consigo sacar (Imagen a Base64)

SaReDnAL

Hola gente, el caso es que me he creado una clase llamada Utils.php donde estoy metiendo algunas utilidades, y no consigo que una función me funcione correctamente.

El panorama es el siguiente. Estoy haciendo pruebas para pasar imagenes fisicas de disco a string y despues las codifico en base64 (para posteriormente meterlas a BD pero ahora no es el caso).

Y luego el proceso contrario, una vez tengo la imagen en string, intento decodificarla de nuevo y mostrarla en el navegador.

El caso es que si pongo todo el codigo en el mismo php a saco funciona bien, pero si hago la llamada a través de la función no funciona.

EJEMPLO -- CODIGO TODO EN EL MISMO PHP

Aqui tenemos el index.php en el que solo tengo la llamada a la página images.php

<?php

echo '<img src="images.php">';

?>

Aqui tenemos el fichero images.php, el cual puesto de esta manera funciona perfectamente, me muestra la imagen por el navegador después de las pruebas de codificado, decodificado,etc.

<?php

$handle = fopen("imagen.jpg","r");
$img = fread($handle, filesize("imagen.jpg"));
fclose($handle);
//die($img);

    $imgenc = base64_encode($img);
    $imgdecoded = base64_decode($imgenc);
    $new_im = imagecreatefromstring($imgdecoded);
   Header("Content-Type: image/jpeg");
   Header("Content-Description: PHP Generated Image");
   Imagejpeg($new_im);

?

Y ahora entra el problema en cuestión. En vez de poner el codigo de transformación de imagenes en base64 en imagen.php, lo tengo en la clase Utils.php con la siguiente función:

function FicheroABytes($rutafichero) {

    $handle = fopen($rutafichero,"r");
    $img = fread($handle, filesize($rutafichero));
    fclose($handle);
    //die($img);

    $imgenc = base64_encode($img);

  return $imgenc;
}

}

Pues bien, si en vez de poner todas las lineas en el mismo fichero, instancio la clase y llamo a la función FIcheroABytes, no consigo ver la imagen en el navegador.

El codigo sería el siguiente

$ImageUtils = new Utils();
$imagenenc = $ImageUtils->FicheroABytes("imagen.jpg");

$imagendesenc= base64_decode($imagenenc);

$new_im = imagecreatefromstring($imagendesenc);
Header("Content-Type: image/jpeg");
Header("Content-Description: PHP Generated Image");
Imagejpeg($new_im);

El caso es que la función devuelve una pedazo de ristra de datos que puedo ver
haciendo un echo, pero no la consigue interpretar.

Me sale en el browser la imagén como si estuviera "rota".

Saludos y gracias de antemano!.

LOc0

Mmmm, raro a priori. De momento vete poniendo esto (arriba del todo en el script principal).

error_reporting(E_ALL ^ E_NOTICE | E_STRICT);

¿Has probado con la ruta absoluta del fichero de imagen?

Salu2 ;)

SaReDnAL

He puesto error_reporting(E_ALL ^ E_NOTICE | E_STRICT);

También he probado poniendolo en el php.ini

En el index.php, justo despues del <?php

y no me saca ningún mensaje :S

Edit: Acabo de probar mi función con la ruta completa y tampoco pirula:

$ImageUtils = new Utils();
$imagenenc = $ImageUtils->FicheroABytes("C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\webphp\imagen.jpg");

LOc0

Prueba con la ruta absoluta al fichero, por si fopen se lia al abrir el fichero desde el directorio donde tengas utils.php o como lo hayas llamado. Si no va, prueba a sacar un echo md5($imgenc) y otro md5(FicheroABytes($ruta)); por ir descartando...

Edito: no sé si tendrá que ver, ya que te funcionaba antes, pero en Windows se deben abrir los ficheros binarios con "rb" en fopen...

Edito2: ¿esa ruta absoluta es correcta?

Edito3: mete un if(is_readable($ruta)) en FicheroABytes antes de hacer nada.

Salu2 ;)

SaReDnAL

Antes con tenía con rb, lo he cambiado a raiz del problema este .

Aquí estan los MD5, parece que algo pasa si...

2f1af8b7934a77287ac99edcfaf39e6f
<br>
2f1af8b7934a77287ac99edcfaf39e6f5d7b209c8935a7090fbc4b9626c7dbb2

Pierde la mitad de la cadena parece ser no? :S

El de arriba es el de la función.

De momento no me meto con el is readable porque parece que si lo lee no?, solo que no debe de leerlo completamente :S. Los dos fopen son identicos :S

Por cierto gracias, soy nuevo en php (trabajo con asp.net normalmente) y no conocia esto del md5 en php xD

LOc0

Juas, una cadena MD5 son 32 caracteres (16 bytes). Por tanto, el MD5 largo no es correcto. Mira a ver si te ha concatenado algo al echo o haces otro echo seguido. (El largo es el doble, así que parece que imprimes dos hashes seguidos...)

Salu2 ;)

SaReDnAL

Perdona tio, estoy tonto y lo puse 3 veces el echo.

2f1af8b7934a77287ac99edcfaf39e6f<br>

2f1af8b7934a77287ac99edcfaf39e6f<br>

Si coincide el md5 por lo que veo :S

Comentarte, que no usaba la ruta absoluta, ya que a raiz de está gilipollez me he rayado y he puesto todo en la misma carpeta. El index, las clases, la imagen... todo.

LOc0

¿Entonces coincide el hash de $imgenc sin función y lo que te devuelve la función? ¿Coinciden los hashes del $img_new de arriba y el de abajo? Es raro... ¿haces algún echo por ahí raro o tienes algún salto de línea o carácter fuera de los <?php ?> ?

Consejo: QUITA el tag de cierre de PHP ?> de todos los ficheros php que uses en includes NO es obligatorio y a veces produce errores "extraños".

Salu2 ;)

SaReDnAL

Si, si que coincide que me estaba volviendo loco macho, perdona

2f1af8b7934a77287ac99edcfaf39e6f<br>
2f1af8b7934a77287ac99edcfaf39e6f<br>

$imagenenc = $ImageUtils->FicheroABytes("C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\webphp\imagen.jpg");

$resultmd5 = md5($imagenenc);
echo $resultmd5;
echo '<br>';


$handle = fopen("imagen.jpg","rb");
$img = fread($handle, filesize("imagen.jpg"));
fclose($handle);
//die($img);

$imgenc = base64_encode($img);
$resultmd5 = md5($imgenc);
echo $resultmd5;
echo '<br>';

PD: Acabo de dejar la página limpia, solo tiene esto, para ver si funciona-

Del new_img no puedo obtener el Hash porque no es un string

LOc0

Joder... Prueba con

imagejpeg( $new_img, "RUTA" );

De esta forma en vez de enviar la imagen al navegador la guardas como un fichero. Luego haz un echo md5_file( "RUTA" ); Compara los hashes a ver.

Salu2 ;)

SaReDnAL

Aqui estan los hashes del MD5_file de los dos ficheros resultantes en la carpeta del proyecto.

af7d1d37ebff5806bf38846eea965daa<br>
af7d1d37ebff5806bf38846eea965daa

15,5 kb de tamaño ambos

Además la imagen proveniente de la función se previsualiza bien en windows, no esta fastidiada

Esto no tiene sentido xD

LOc0

Lógico que se visualice bien, son idénticas xD Parece que es cosa de las cabeceras que se envían. Revisa todos los ficheros php que uses en algún include para que no tenga ningún salto de línea o espacio antes del <?php o después del ?> Tb revisa el fichero principal por lo mismo. Y por supuesto NINGÚN ECHO después del imagejpg...

Y bienvenido a PHP ;)

Salu2 ;)

SaReDnAL

Ya lo he solucionado!!!!

Dentro del fichero images.php no estaba el require Utils.php, lo he puesto y listo, el caso es que no daba Exception call function y encontraba la función y devolvía datos.!!

Muchas gracias por tu ayuda compañero, estas hecho un fenómeno, lo que he aprendido por el camino ajajajajaj

PD: Que tipo de campo tendría que crear en SQL SERVER para almacenar un string en base64 desde que este va a ser variable dependiendo del tamaño de la imagen?

GRACIAS!

LOc0

¿No tenías el require? Mi maaaaaaaaaadre xDD ¿Pero cómo salían los hashes bien? Joder qué raro ¬ ¬... Bueno, me alegro de que lo hayas arreglado.

Salu2 ;)

PD: http://msdn.microsoft.com/en-us/library/ms187993.aspx

¡me piro!

SaReDnAL

No, no estaba puesto, pero el caso es que en el resto de páginas si no lo pongo
no me coge las funciones. Algo rarisimo, y además lo que tu dices, que estaba yendo a la función
porque los hashes funcionaban

Muchas gracias por todo de nuevo ;)

Usuarios habituales

  • SaReDnAL
  • LOc0