Autor Tema: Subir archivos a Base de datos MySQL  (Leído 17794 veces)

Conectado naveda

  • Administrador General
  • PHPero Master
  • *****
  • Mensajes: 2.282
  • Karma: 165
  • Sexo: Masculino
    • Ver Perfil
    • naveda.me
Subir archivos a Base de datos MySQL
« en: 03 de Enero de 2008, 00:07:03 am »
¡Hola!

Hace bastante tiempo que no posteaba ningun tutorial y es que no habia encontrado el momento, pero ya que son fiestas y que tengo tiempo libre he hecho este simple tutorial para que aprendais a hacer un Upload de archivos mediante PHP y guardar los datos en una base de datos MySQL.

Comenzare comentando que en este caso vamos a tener que recurrir a un tipo de campo MySQL no muy utilizado en el ambito de nuestra comunidad asi que os voy a dar de paso varias indicaciones sobre el campo BLOB.

Este tipo de campo, BLOB, permite guardar contenido de tipo Binario, esto quiere decir que podemos guardar imagenes, archivos de sonido y multimedia (no todo tipo de archivo, por eso yo solo voy a trabajar con imagenes).

Codigo SQL
Código: [Seleccionar]
CREATE TABLE `imagenes` (
  `id` int(11) NOT NULL auto_increment,
  `nombre` varchar(30) NOT NULL default '',
  `tipo` varchar(30) NOT NULL default '',
  `descripcion` varchar(255) NOT NULL default '',
  `fecha` varchar(255) NOT NULL default '',
  `ip` varchar(255) NOT NULL default '',
  `imagen` mediumblob NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

Como veis he usado un campo de tipo mediumblob pero tambien podeis blob, tinyblob, longblob,...

UPLOADER
<?PHP
//Conexion
if (isset($_POST[&#39;enviar&#39;])) {
	
$tipos = array("image/gif","image/jpeg","image/bmp","image/pjpeg");
	
$maximo 102400//100Kb
	
if (
is_uploaded_file($_FILES[&#39;imagen&#39;][&#39;tmp_name&#39;])) { // Se ha subido?
	
	
if (
in_array($_FILES[&#39;imagen&#39;][&#39;type&#39;],$tipos) && $_FILES[&#39;imagen&#39;][&#39;size&#39;] <= $maximo) { // Es correcto?
	
	
	
$fp fopen($_FILES[&#39;imagen&#39;][&#39;tmp_name&#39;], &#39;r&#39;); //Abrimos la imagen
	
	
	
$imagen fread($fpfilesize($_FILES[&#39;imagen&#39;][&#39;tmp_name&#39;])); //Extraemos el contenido de la imagen
	
	
	
$imagen addslashes($imagen);
	
	
	
fclose($fp); //Cerramos imagen
	
	
	
if(!
get_magic_quotes_gpc())
	
$nombre addslashes($_FILES[&#39;imagen&#39;][&#39;name&#39;]); // Arreglamos el Nombre
	
	
	
else 
$nombre $_FILES[&#39;imagen&#39;][&#39;name&#39;];
	
	
	
$query "INSERT INTO `imagenes` (imagen,nombre,tipo,descripcion,fecha,ip) VALUES ";
	
	
	
$query.= "(&#39;".$imagen."&#39;,&#39;".$nombre."&#39;,&#39;".$_FILES[&#39;imagen&#39;][&#39;type&#39;]."&#39;,&#39;";
	
	
	
$query.= mysql_real_escape_string($_POST[&#39;descripcion&#39;])."&#39;,&#39;";
	
	
	
$query.= date("d/m/y",time())."&#39;,&#39;".$_SERVER[&#39;REMOTE_ADDR&#39;]."&#39;)";
	

	
	
	
if (
mysql_query($query)) echo &#39;<img src="visor.php?mostrar=&#39;.mysql_insert_id().&#39;">&#39;;
	
	
	
else echo 
mysql_error();
	

	
	
} else echo 
"El formato del archivo no es correcto o es mayor de 100Kb";
	
} else echo 
"La imagen no ha sido subida";
}
//Desconexion DB
?>
<form enctype="multipart/form-data" method="POST">
Imagen: <input type="file" name="imagen" /><br />
Breve Descripcion: <input type="text" name="descripcion" /> <i>(Opcional)</i><br /><br />
<input type="submit" name="enviar" value="Enviar" />
</form>


VISOR
<?PHP
if (is_numeric($_GET[&#39;mostrar&#39;])) {
	
// Conexion a la Base de Datos
	
$query mysql_query("SELECT * FROM `imagenes` WHERE id = &#39;".$_GET[&#39;mostrar&#39;]."&#39;") or exit();
	
if (!
mysql_num_rows($query)) exit(header("HTTP/1.0 404 Not Found"));
	
$datos mysql_fetch_array($query);
	
header("Content-Type: ".$datos[&#39;tipo&#39;]);
	
echo 
$datos[&#39;imagen&#39;];
	
//Desconexion
} else header("HTTP/1.0 404 Not Found");
?>


Creo que el codigo se explica bastante por si mismo y por los comentarios que he dejado en las lineas, aún así podeis preguntarme cualquier cosa que querais.

Si no os funciona en vuestro servidor es porque la version de PHP que usais no es compatible con $_FILES, por tanto debereis cambiar $_FILES por $_HTTP_POST_FILES y supongo que no habra problemas.
« Última modificación: 03 de Enero de 2008, 12:43:29 pm por naveda »
Por favor, leete las Normas


Comunidad PHPeros

Subir archivos a Base de datos MySQL
« en: 03 de Enero de 2008, 00:07:03 am »

Desconectado Martin10

  • PHPer@ Fijo
  • ***
  • Mensajes: 160
  • Karma: 11
  • Sexo: Masculino
    • Ver Perfil
Re: Subir archivos a Base de datos MySQL
« Respuesta #1 en: 03 de Enero de 2008, 00:30:11 am »
Buenísimo nevada :D ... KARMA+
8)

Desconectado x.mara.x

  • PHPero Master
  • ******
  • Mensajes: 1.364
  • Karma: 57
  • Sexo: Femenino
    • Ver Perfil
Re: Subir archivos a Base de datos MySQL
« Respuesta #2 en: 03 de Enero de 2008, 00:50:13 am »
+karma :P

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re: Subir archivos a Base de datos MySQL
« Respuesta #3 en: 03 de Enero de 2008, 10:12:29 am »
Que bueno, al principio crei que era un simple uploader normal y corriente pero cuando lo vi :o
Muy bueno jeje, te doy un karma.

Saludos
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Conectado naveda

  • Administrador General
  • PHPero Master
  • *****
  • Mensajes: 2.282
  • Karma: 165
  • Sexo: Masculino
    • Ver Perfil
    • naveda.me
Re: Subir archivos a Base de datos MySQL
« Respuesta #4 en: 03 de Enero de 2008, 12:42:04 pm »
Como veis he programado el visor para que cuando no exista la imagen que se solicita u ocurra algun error se muestre una cabecera de tipo 404, lo cual quiere decir que el navegador sabra que la imagen no existe.

Por otro lado, espero que os fijeis en la comprobacion del tipo de archivos y que la apliqueis en los vuestros, digo esto porque hasta ahora este es el metodo de comprobacion mas seguro que puedes encontrar, ya que comprobar la extension del archivo subido es un tanto inseguro. Comprobad SIEMPRE EL MIME TYPE (Lista MIME Type) ;)

Hago estos comentarios por si surgieran dudas.
« Última modificación: 03 de Enero de 2008, 13:46:24 pm por naveda »
Por favor, leete las Normas


Desconectado caha

  • PHPer@ Fijo
  • ***
  • Mensajes: 111
  • Karma: 0
    • Ver Perfil
Re: Subir archivos a Base de datos MySQL
« Respuesta #5 en: 01 de Marzo de 2008, 20:34:48 pm »
disculpa y para subir un folder completo ?

Desconectado Joel

  • PHPer@ Fijo
  • ***
  • Mensajes: 141
  • Karma: 5
    • Ver Perfil
Re: Subir archivos a Base de datos MySQL
« Respuesta #6 en: 02 de Marzo de 2008, 04:19:58 am »
Ahh naveda me impresionaste..  xD Lo voy a utilizar aver que tal es.

Karma+  ;)

Desconectado alienmaster

  • PHPer@ Fijo
  • ***
  • Mensajes: 102
  • Karma: 12
  • Sexo: Masculino
  • No dependo de nadie!!
    • Ver Perfil
    • 4cosaS
Re: Subir archivos a Base de datos MySQL
« Respuesta #7 en: 03 de Mayo de 2008, 01:34:16 am »
Esta bastante bien, lo bueno seria hacerlo valido para todo tipo de archivos como hace el smf, quizas lo inente en caso de que me aburra (Que suele pasar.. xD)

Desconectado broo

  • PHPer@
  • **
  • Mensajes: 56
  • Karma: 3
  • Sexo: Masculino
    • Ver Perfil
Re: Subir archivos a Base de datos MySQL
« Respuesta #8 en: 12 de Junio de 2009, 03:04:08 am »
y como se hace la conexion a la base de datos? hay que poner un conectar.php o que?

Desconectado HooKiPo

  • PHPerit@
  • *
  • Mensajes: 25
  • Karma: 0
    • Ver Perfil
Re: Subir archivos a Base de datos MySQL
« Respuesta #9 en: 16 de Junio de 2009, 23:26:19 pm »
muchas gracias naveda muy bueno :D