Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Problema con guardar img en bd

Estas en el tema de Problema con guardar img en bd en el foro de PHP en Foros del Web. Buenas foro. Estoy tratando de guardar una imagen en un campo blob en mysql con php, el problema es que cuando trato de guardarla en ...
  #1 (permalink)  
Antiguo 11/02/2016, 16:59
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Pregunta Problema con guardar img en bd

Buenas foro.

Estoy tratando de guardar una imagen en un campo blob en mysql con php, el problema es que cuando trato de guardarla en una variable para poder enviarla a mysql me salen caracteres raros que no he podido quitar o solucionar.

He hecho inserciones directas a la bd con el phpmyadmin y la codificacion de la imagen esta limpia y p uedo leer las imagenes y mostrarlas, pero las que guardo desde el form con php no las puedo mostrar.

Espero me puedas ayudar.

Código PHP:
Ver original
  1. if(is_uploaded_file($_FILES["logoEmpresa"]["tmp_name"])):
  2.  
  3.         $permitidos = array("image/jpg", "image/jpeg", "image/gif", "image/png");
  4.         $limite_kb = 16384;
  5.  
  6.         if (in_array($_FILES['logoEmpresa']['type'], $permitidos) &&     $_FILES['logoEmpresa']['size'] <= $limite_kb * 1024):
  7.  
  8.           $nombre = $_FILES['logoEmpresa']['name'];
  9.           $imagen_temporal = $_FILES['logoEmpresa']['tmp_name'];
  10.           $type = $_FILES['logoEmpresa']['type'];
  11.           //archivo temporal en binario
  12.           $itmp = fopen($imagen_temporal, 'r+b');
  13.           $imagen = fread($itmp, filesize($imagen_temporal));
  14.           fclose($itmp);
  15.  
  16.           //escapar los caracteres
  17.           $imagen = mysql_real_escape_string($imagen);
  18.  
  19.           $this->empresasModel->set("ImgEmpresa",$imagen);
  20.           $this->empresasModel->set("ImagenTipo",$type);
  21.         endif;
  22.       endif;

Esto me regresa algo como esto:
Código txt:
Ver original
  1. �PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0�\0\0\0�\0\0\0�>a�\0\0�IDATx��_�UuǏCNEF��h�!��m �;��x�o��o-h��||)���JH+t\ZB)��{�x���8����D�TA(Cq!����z�:y�^=��:���֫w���g�}�޶ZJn:=�؍�N`�Z�c����8ρ�`��g��0�\0�#�q�a�\n�q���ꛥס�I���L�[�iO[O�...

mucho texto con todos esos simbolos y cuando la guardo directamente en phpmyadmin me regresa algo como esto:
Código txt:
Ver original
  1. 0xffd8ffe000104a46494600010100000100010000ffdb00430006040506050406060506070706080a100a0a09090a140e...

De antemano muchas gracias
__________________
Lo imposible solo cuesta un poco mas
  #2 (permalink)  
Antiguo 11/02/2016, 17:08
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema con guardar img en bd

Esos "símbolos raros" que mencionas es la información binaria de la imagen, no es ningún error.

Ahora, no debes escapar dicha información como si fuera texto porque no lo es.

Revisa en el manual que debes usar para escapar información binaria (que seguramente phpMyAdmin lo hace bien).

PDTA: guardar archivos (por decirlo así) en campos BLOB es una pésima practica y deberías evitarla, lo correcto es guardar dicho archivo en el sistema de archivos y sólo guardar en base de datos la ruta o nombre de dicho archivo, etc.

Las base de datos no se diseñaron para almacenar archivos.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 11/02/2016, 17:42
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Respuesta: Problema con guardar img en bd

Gracias por la respuesta.

Pero si entonces asi es la codificacion binaria, entonces porque no puedo mostrar la imagen...
__________________
Lo imposible solo cuesta un poco mas
  #4 (permalink)  
Antiguo 11/02/2016, 17:45
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema con guardar img en bd

Cita:
entonces porque no puedo mostrar la imagen...
Sería interesante entonces que muestres dicho código con el que muestras la imagen, de otra forma no podríamos adivinar qué harás mal.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 11/02/2016, 17:58
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Respuesta: Problema con guardar img en bd

Código PHP:
Ver original
  1. public function mostrarEmpresas($idEmpresa){
  2.     $this->empresasModel->set("IdGuidUsuarios",Session::get("id_usuario"));
  3.     $datosEmpresa = $this->empresasModel->logoEmpresas($idEmpresa);
  4.  
  5.     header("Content-type: $datosEmpresa->ImagenTipo");
  6.  
  7.     echo $datosEmpresa->ImgEmpresa;
  8.  
  9.   }
  10.  
  11.  
  12. <img src="<?php echo BASE_URL."empresas/mostrarEmpresas/3" ?>" alt="..." class="img-circle imgMed center-block zoom">
__________________
Lo imposible solo cuesta un poco mas
  #6 (permalink)  
Antiguo 11/02/2016, 17:58
Avatar de Ciberdanny  
Fecha de Ingreso: marzo-2005
Ubicación: Distrito Federal
Mensajes: 208
Antigüedad: 19 años, 1 mes
Puntos: 1
Respuesta: Problema con guardar img en bd

lo mejor es que coloques la imagen en alguna ruta accesible para quienes entren a tu sistema...

luego en la base de datos en algun campo tipo texto guardes la ruta de esta imagen con todo y su nombre y extension... y luego al consultar, en el contenido de tu página pones una imagen, quesu ruta de acceso será la variable de tu base de datos...

guardar archivos directamente en la bade de datos sera un quebradero de cabeza, pero suerte


un saludo
__________________
www.eris.com.mx
  #7 (permalink)  
Antiguo 11/02/2016, 18:04
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Respuesta: Problema con guardar img en bd

La situacion es que como lo requieren es guardarlo en la base de datos...
Yo ya habia hecho el otro procedimiento de guardarlo en una carpeta y solo traer la ruta.
__________________
Lo imposible solo cuesta un poco mas
  #8 (permalink)  
Antiguo 11/02/2016, 18:14
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema con guardar img en bd

Sería bueno si habilitas el reporte completo de errores e intentas cargar dicha URL que imprime la imagen directamente en el navegador.

Otra posible causa del problema podría ser si tu modelo, en el método set(), ya hace el escape de los datos: entonces estarías escapando dos veces dicha información.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 12/02/2016, 10:52
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Respuesta: Problema con guardar img en bd

Gracias a todas las personas que me apoyaron con este problema, por fin encontre el problema.

Solo era cuestion de codificarlo en base 64 y al mostrar la imagen en decodificacion base 64 para los que les pueda servir dejo mi codigo.

Código PHP:
Ver original
  1. if (in_array($_FILES['logoEmpresa']['type'], $permitidos) && $_FILES['logoEmpresa']['size'] <= $limite_kb * 1024):
  2.  
  3.           $nombre = $_FILES['logoEmpresa']['name'];
  4.           $tmp = $_FILES['logoEmpresa']['tmp_name'];
  5.           $type = $_FILES['logoEmpresa']['type'];
  6.           $size = $_FILES["logoEmpresa"]["size"];
  7.  
  8.           error_reporting(E_ALL);
  9.  
  10.           $fp = fopen($tmp, "rb");
  11.           $binaryImage = fread($fp, filesize($tmp));
  12.           //$binaryImage = addslashes($binaryImage);
  13.           fclose($fp);
  14.  
  15.           @unlink($tmp);
  16.  
  17.           $binaryImage = base64_encode($binaryImage);
  18.  
  19.           $this->empresasModel->set("ImgEmpresa",$binaryImage);
  20.           $this->empresasModel->set("ImagenTipo",$type);
  21.         endif;

Para mostrar la imagen desde mi metodo queda asi:

Código PHP:
Ver original
  1. public function mostrarEmpresas($idEmpresa){
  2.     $this->empresasModel->set("IdGuidUsuarios",Session::get("id_usuario"));
  3.     $datosEmpresa = $this->empresasModel->logoEmpresas($idEmpresa);
  4.  
  5.     header("Content-type: $datosEmpresa->ImagenTipo");
  6.  
  7.     echo base64_decode($datosEmpresa->ImgEmpresa);
  8.  
  9.   }
En la vista lo unico que hago es:
Código PHP:
Ver original
  1. <img src="<?php echo BASE_URL."empresas/mostrarEmpresas/2" ?>" alt="..." class="img-circle imgMed center-block zoom">


Saludos y gracias.

Espero a alguin le pueda servir este codigo.
__________________
Lo imposible solo cuesta un poco mas
  #10 (permalink)  
Antiguo 12/02/2016, 11:05
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema con guardar img en bd

Cita:
Solo era cuestion de codificarlo en base 64 y al mostrar la imagen en decodificacion base 64
Esa no es una solución real, porque tu campo es BLOB y acepta datos binarios, cuando conviertes a base64 se transforma a texto plano ¿entonces de qué sirve el campo BLOB?

Además convertir a base64 incrementa hasta en un 30-40% el tamaño de lo que conviertes, si una imagen te pesa 100kb en la base de datos estarías almacenando 150kb sólo porque sí.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 12/02/2016, 11:34
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Respuesta: Problema con guardar img en bd

Ok te agradezco que me informes de la situación, pero como solo guardare una imagen por cliente no me causa tanto conflicto y realmente no son muchos clientes.

De antemano muchas gracias òr la observacion...
__________________
Lo imposible solo cuesta un poco mas

Etiquetas: bd, img, mysql, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:09.