Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Mostrar imagen desde mysql con php

Estas en el tema de Mostrar imagen desde mysql con php en el foro de PHP en Foros del Web. Buenas a todos. Les comento a ver si pueden ayudarme. Por un lado, subo imagenes a la BDD de la siguiente forma: Código PHP: <?php ...
  #1 (permalink)  
Antiguo 21/06/2013, 11:20
 
Fecha de Ingreso: mayo-2013
Mensajes: 171
Antigüedad: 11 años
Puntos: 4
Mostrar imagen desde mysql con php

Buenas a todos.
Les comento a ver si pueden ayudarme.
Por un lado, subo imagenes a la BDD de la siguiente forma:

Código PHP:
<?php
//conexion a la base de datos
include("acceso.php");
//    Nos conectamos a phpmyadmin
$conectar mysql_connect($dbhost$dbuser$dbpasswd);
//    Comprobamos que  nos pudieramos conectar a phpmyadmin
if (!$conectar) {
die(
'No se pudo conectar a la base: ' mysql_error());
}
mysql_select_db($dbname) or die(mysql_error()) ;

//comprobamos si ha ocurrido un error.
if ( !isset($_FILES["imagen"]) || $_FILES["imagen"]["error"] > 0){
  echo 
"ha ocurrido un error";
} else {
  
//ahora vamos a verificar si el tipo de archivo es un tipo de imagen permitido.
  //y que el tamano del archivo no exceda los 16MB
  
$permitidos = array("image/jpg""image/jpeg""image/gif""image/png");
  
$limite_kb 16384;

  if (
in_array($_FILES['imagen']['type'], $permitidos) && $_FILES['imagen']['size'] <= $limite_kb 1024){

    
//este es el archivo temporal
    
$imagen_temporal  $_FILES['imagen']['tmp_name'];
    
//este es el tipo de archivo
    
$tipo $_FILES['imagen']['type'];
    
//leer el archivo temporal en binario
                
$fp     fopen($imagen_temporal'r+b');
                
$data fread($fpfilesize($imagen_temporal));
                
fclose($fp);


    
$resultado = @mysql_query("INSERT INTO Usuarios (Imagen, Tipo_imagen) VALUES ('$data', '$tipo')") ;

    if (
$resultado){
      echo 
"el archivo ha sido copiado exitosamente";
    } else {
      echo 
"ocurrio un error al copiar el archivo.";
    }
  } else {
    echo 
"archivo no permitido, es tipo de archivo prohibido o excede el tamano de $limite_kb Kilobytes";
  }
}
?>
Bien, se guarda la imagen en un campo BLOB y el type de la imagen en un campo VARCHAR.
Todo eso correcto.

Pero mi problema viene al intentar mostrar la imagen en una pagina con contenido.
Es decir, puedo usar este codigo para ver la imagen en una pagina nueva, y se ve la imagen sola, asi que la subida funciona:

Código PHP:
<?php
mysql_select_db
($dbname);
$sql"SELECT Imagen, Tipo_imagen FROM Usuarios";
$resultmysql_query($sql$conectar);
$rowmysql_fetch_assoc($result);


  
//ahora colocamos la cabeceras correcta segun el tipo de imagen
  
header("Content-type: ".$row['Tipo_imagen']."");

  echo (
$row['Imagen']);
?>
Pero por ejemplo no podria poner ese codigo aqui:

Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Documento sin título</title>
</head>

<body>
<?php
mysql_select_db
($dbname);
$sql"SELECT Imagen, Tipo_imagen FROM Usuarios";
$resultmysql_query($sql$conectar);
$rowmysql_fetch_assoc($result);


  
//ahora colocamos la cabeceras correcta segun el tipo de imagen
  
header("Content-type: ".$row['Tipo_imagen']."");

  echo (
$row['Imagen']);
?>
</body>
</html>
(Se que faltan datos para la conexion, solo son ejemplos).
Si intento hacer eso, me da error por no poder modificar el Content-type de la pagina que incluye el codigo php...

Entonces como hago para mostrar la imagen??
Porque necesito poder cargar el type de la imagen de alguna forma para que lea la informacion del campo BLOB.

Y por otro lado, alguna idea de como modificar el nombre de la imagen al subirla respetando la extension del archivo?
Quisiera que la imagen tomara el nombre del usuario que la sube ($_COOKIE['Usuario'])
Pero con lo que hago, la renombro pero sin extension...

Gracias por su atencion y ayuda.

Un saludo.
  #2 (permalink)  
Antiguo 21/06/2013, 12:04
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Mostrar imagen desde mysql con php

Código php:
Ver original
  1. header("Content-type: ".$row['Tipo_imagen']."");

esto es el header para mandar una imagen al navegador no para mandar una imagen a un html que por su parte ya ha llegado al navegador con su header.

Lo mejor que podrias hacer es guardar el nombre de la imagen en un campo de texto de la base de datos (loqusea.ext) y el fichero de la imagen en un directorio del servidor. Esto es lo que se ha recomendado repetidas veces en este foro.

Luego no tendras problemas para mostrarla en un html

Código PHP:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>Documento sin título</title>
  6. </head>
  7.  
  8. <body>
  9. <?php
  10. mysql_select_db($dbname);
  11. $sql= "SELECT Imagen FROM Usuarios";
  12. $result= mysql_query($sql, $conectar);
  13. $row= mysql_fetch_assoc($result);
  14. ?>
  15. <img scr="ruta/<?php echo $row['Imagen'];?>">
  16. </body>
  17. </html>

Donde ruta es la dirección relativa entre el fichero php y el directorio donde tienes las imagenes y $row['Imagen']="loquesea.ext" es decir el nombre del fichero con su extensión....

Eso eliminará ese campo BLOB y redundará en mas eficiencia de la base de datos.

En cuanto a cambiar el nombre del fichero tambien lo podrias hacer.... busca uno de los muchos scripts que se han posteado de como subir ficheros todos, como el tuyo, usan $_FILES, leen el fichero temporal que se ha creado y lo copian a un directorio permanente con un nuevo nombre en ese momento es cuestion de concatenar al nombre que le quieras dar la extensión. Mas que el nombre del usuario yo le pondria el id del usuario. NO INSERTES EL ARCHIVO EN LA BBDD
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 21/06/2013 a las 12:17

Etiquetas: html, mysql, select, sql, usuarios
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 03:15.