Your Ad Here

Upload de archivos con PHP y Mysql

Jun 2008
28
679 views
0

Este Howto es acerca de como subir archivos atravez de PHP y guardarlos en MySQL asi como la extracción del archivo de MySQL atravez de PHP.

Requisitos:

  • Tener instalado PHP y MySQL.
  • Conocimientos basicos de PHP y MySQL.

Muchas veces necesitamos darle a los usuarios la facilidad de poder “subir” o guardar archivos en una base de datos y n es tan dificil como aparenta asi que comenzemos….

Primeramente necesitamos el diseño de la tabla

y el script para crear la tabla es:

CREATE TABLE tbl_documentos (
  id_documento INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  titulo VARCHAR(150) NULL,
  descripcion MEDIUMTEXT NULL,
  contenido LONGBLOB NULL,
  tamanio INTEGER UNSIGNED NULL,
  tipo VARCHAR(150) NULL,
  nombre_archivo VARCHAR(255) NULL,
  tamanio_unidad VARCHAR(150) NULL,
  PRIMARY KEY(id_documento)
);

Explico un poco cada campo para darnos una mayor idea:

  • id_documento es el identificador o llave primaria
  • titulo contiene titulo para el documento
  • descripción contiene la descripcion del documento
  • contenido en este campo en donde se guardara nuestro documento
  • tamamio en este campo guardamos el tamaño del documento
  • tipo contendra el tipo MIME del documento
  • nombre_archivo contendra el nombre del documento
  • tamanio_unidad en este campo registraremos si la medida esta em kb,MB,GB

Ahora necesitamos un formulario
Aqui esta el codigo del archivo form.html:

<form id="test_upload" name="test_upload" action="upload.php" enctype="multipart/form-data" method="post">
	<table border="0" cellpadding="0" cellspacing="0">
		<tr>
			<td>
				Titulo
			</td>
			<td>
				<input type="text" id="titulo" name="titulo"/>
			</td>
		</tr>
		<tr>
			<td colspan="2">
				Descripcion
			</td>
		</tr>
		<tr>
			<td colspan="2">
				<textarea id="descripcion" name="descripcion" cols="50" rows="5"></textarea>
			</td>
		</tr>
		<tr>
			<td colspan="2">
				Archivo <input type="file" id="archivo" name="archivo"/>
			</td>
		</tr>
		<tr>
			<td colspan="2">
				<input type="submit" value="Registrar Documento"/>
			</td>
		</tr>
	</table>
</form>

Al formulario debemos como todos debe tener sus atributos
action que indica el archivo que sse encargara de procesar la información que le enviemos
y method que indica si los datos seran enviados por POST o GET para envio de archivos es obligatorio marcarlo como POST
adicinal a estos atributos debemos especificar enctype con el valor multipart/form-data para que se pueda realizar el envio.
Y aqui esta el codigo del archivo upload.php

< ?php
//ESTA FUNCION LA USAREMOS PARA OBTENER EL TAMAÑO DE NUESTRO ARCHIVO
function filesize_format($bytes, $format = '', $force = ''){
	$bytes=(float)$bytes;
	if ($bytes< 1024){
		$numero=number_format($bytes, 0, '.', ',');
		return array($numero,"B");
	}
	if ($bytes< 1048576){
		$numero=number_format($bytes/1024, 2, '.', ',');
		return array($numero,"KBs");
	}
	if ($bytes>= 1048576){
		$numero=number_format($bytes/1048576, 2, '.', ',');
		return array($numero,"MB");
	}
}
//VERIFICAMOS QUE SE SELECCIONO ALGUN ARCHIVO
if(sizeof($_FILES)==0){
	echo "No se puede subir el archivo";
	exit();
}
// EN ESTA VARIABLE ALMACENAMOS EL NOMBRE TEMPORAL QU SE LE ASIGNO ESTE NOMBRE ES GENERADO POR EL SERVIDOR
// ASI QUE SI NUESTRO ARCHIVO SE LLAMA foto.jpg el tmp_name no sera foto.jpg sino un nombre como SI12349712983.tmp por decir un ejemplo
$archivo = $_FILES["archivo"]["tmp_name"];
//Definimos un array para almacenar el tamaño del archivo
$tamanio=array();
//OBTENEMOS EL TAMAÑO DEL ARCHIVO
$tamanio = $_FILES["archivo"]["size"];
//OBTENEMOS EL TIPO MIME DEL ARCHIVO
$tipo = $_FILES["archivo"]["type"];
//OBTENEMOS EL NOMBRE REAL DEL ARCHIVO AQUI SI SERIA foto.jpg
$nombre_archivo = $_FILES["archivo"]["name"];
//PARA HACERNOS LA VIDA MAS FACIL EXTRAEMOS LOS DATOS DEL REQUEST
extract($_REQUEST);
//VERIFICAMOS DE NUEVO QUE SE SELECCIONO ALGUN ARCHIVO
if ( $archivo != "none" ){
	//ABRIMOS EL ARCHIVO EN MODO SOLO LECTURA
	// VERIFICAMOS EL TAÑANO DEL ARCHIVO
	$fp = fopen($archivo, "rb");
	//LEEMOS EL CONTENIDO DEL ARCHIVO
	$contenido = fread($fp, $tamanio);
	//CON LA FUNCION addslashes AGREGAMOS UN \ A CADA COMILLA SIMPLE ' PORQUE DE OTRA MANERA
	//NOS MARCARIA ERROR A LA HORA DE REALIZAR EL INSERT EN NUESTRA TABLA
	$contenido = addslashes($contenido);
	//CERRAMOS EL ARCHIVO
	fclose($fp);
	// VERIFICAMOS EL TAÑANO DEL ARCHIVO
	if ($tamanio &lt;1048576){
		//HACEMOS LA CONVERSION PARA PODER GUARDAR SI EL TAMAÑO ESTA EN b ó MB
		$tamanio=filesize_format($tamanio);
	}

	//CREAMOS NUESTRO INSERT
	$qry = "INSERT INTO tbl_documentos ( titulo,nombre_archivo, descripcion, contenido, tamanio,tamanio_unidad, tipo ) VALUES
	('$titulo','$nombre_archivo', '$descripcion','$contenido','{$tamanio[0]}','{$tamanio[1]}', '$tipo')";

	//NOS CONECAMOS A LA BASE DE DATOS
	//REMPLAZEN SUS VALOS POR LOS MIOS
	mysql_connect("localhost","root","12345") or die("No se pudo conectar a la base de datos");

	//SELECCIONAMOS LA BASE DE DATOS CON LA CUAL VAMOS A TRABAJAR CAMBIEN EL VALOR POR LA SUYA
	mysql_select_db("test");

	//EJECUTAMOS LA CONSULTA
	mysql_query($qry) or die("Query: $qry <br />Error: ".mysql_error());

	//CERRAMOS LA CONEXION
	mysql_close();
	//NOTIFICAMOS AL USUARIO QUE EL ARCHVO SE HA ENVIADO O REDIRIGIMOS A OTRO LADO ETC.
	echo "Archivo Agregado Correctamente<br />";
	echo '<a href="form.html">Subir Otro Archivo</a><br /> ';
}else{
	echo "No fue posible subir el archivo";
	echo '<a href="form.html">Subir Otro Archivo</a><br /> ';
}
?>

Ahora que ya tenemos nuestro script funcionando y podemos hacer los uploads que queramos vamos
hacer que se puedan explorar y descargar o mostrar en caso de que sea una imagen.
Primero creamos un archivo que nos imprima el contenido del documento y el tipo del mismo para poder renderizarlo
con este archivo que llamaremos getfile.php

< ?php
//NOS CONECAMOS A LA BASE DE DATOS
//REMPLAZEN SUS VALOS POR LOS MIOS
mysql_connect("localhost","root","12345") or die("No se pudo conectar a la base de datos");

//SELECCIONAMOS LA BASE DE DATOS CON LA CUAL VAMOS A TRABAJAR CAMBIEN EL VALOR POR LA SUYA
mysql_select_db("test");

//CONSTRUIMOS LA CONSULTA PARA OBTENER EL DOCUMENTO
$qry="Select * from tbl_documentos where id_documento={$_REQUEST['id_documento']}";
$res=mysql_query($qry) or die(mysql_error()." qry::$qry");
$obj=mysql_fetch_object($res);

//OBTENEMOS EL TIPO MIME DEL ARCHIVO ASI EL NAVEGADOR SABRA DE QUE SE TRATA
header("Content-type: {$obj->tipo}");

//OBTENEMOS EL NOMBRE DEL ARCHIVO POR SI LO QUE SE REQUIERE ES DESCARGARLO
header('Content-Disposition: attachment; filename="'.$obj->nombre_archivo.'"');

//Y PO ULTIMO SIMPLEMENTE IMPRIMIMOS EL CONTENIDO DEL ARCHIVO
print $obj->contenido;

//CERRAMOS LA CONEXION
mysql_close();
?>

Posteriormente crearemos un archivo para que nos liste los documentos registrados y
detecte si es una imagen en este caso imprimiremos un tag img y su src sera nuestro archivo getfile.php
cuando incluimos un archivo con php podemos pasarle parametros cono si se tratara de un query string del browser asi que le pasaremos el id_documento
para que nos muestre el archivo solicitado.
Este es e código de nuestro archivo list.php

< ?php
//NOS CONECAMOS A LA BASE DE DATOS
//REMPLAZEN SUS VALOS POR LOS MIOS
mysql_connect("localhost","root","12345") or die("No se pudo conectar a la base de datos");

//SELECCIONAMOS LA BASE DE DATOS CON LA CUAL VAMOS A TRABAJAR CAMBIEN EL VALOR POR LA SUYA
mysql_select_db("test");

//CONSTRUIMOS EL QUERY PARA OBTENER LOS ARCHIVOS
$qry="select
		docs.*,
		CASE docs.tipo
			WHEN 'image/png' then
				'image'
			WHEN 'image/jpg' then
				'image'
			WHEN 'image/gif' then
				'image'
			WHEN 'image/jpeg' then
				'image'
			ELSE
				'file'
		END as display
	from tbl_documentos AS docs";

//EJECUTAMOS LA CONSULTA
$res=mysql_query($qry) or die("Query: $qry ".mysql_error());

//RECORREMOS LA CONSULTA
//*********NOTA DONDE DICE alt='$obj-/>titulo' QUITA LA BARRA PARA QUE QUEDE ASI:
// alt='$obj->titulo'
// EL WORDPRESS ME ESTA REMPLAZANDO EL CODIGO

while ($obj=mysql_fetch_object($res)) {
	//SI EL TIPO DE DOCUMENTO ES UMAGEN LA MOSTRAMOS SI NO SOLO HACEMOS EL LINK
	switch ($obj->display){
		case "image":
			echo "<div>
					<a href='getfile.php?id_documento={$obj->id_documento}'>
						<img alt='$obj-/>titulo' src='getfile.php?id_documento={$obj->id_documento}'/>
					</a>
				</div><hr />";
			break;
		case "file":
			echo "<div>
					<a href='getfile.php?id_documento={$obj->id_documento}'>$obj->titulo</a>
				</div><hr />";
			break;
	}

}

//CERRAMOS LA CONEXION
mysql_close();
?>

Ahora solo abrimos nuestro explorador con loas sigueintes direcciones:

  • http://url_deprueba/form.html -> Veremos nuestro formulario de subida
  • http://url_deprueba/list.php -> Veremos el listado de nuestros documentos

Descargar los archivos del howto de este

Y con esto terminamos este pequeño howto de como manejar archivos con php y MySQL
espero les sirva y cualquier comentario queja o sugerencia porfavor haganla saber asi como alguna duda que tengan y se pueda convertir en un howto
sera tomada en cuenta.
Cudense …

Si te gusto este post y te sientes dadivoso,Invitame un cafe

Responder


Deja tu comentario