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:
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:
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 <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 'Subir Otro Archivo<br /> ';
}else{
echo "No fue posible subir el archivo";
echo 'Subir Otro Archivo<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:
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 …
Carlos desde
este script está muy bien hecho y claro, pero es peligroso, porque pueden subir a tu servidor un archivo .php u otro tipo.
yo lo retocado añadiento el mime que solo quiero permitir que suban
aqui esta la lista
http://www.w3schools.com/media/media_mimeref.asp
con un sencillo if, lo solucionamos
if (($tipo==”aqui el mime que quieres que suban”))
{
saludos
Responder
Ruben Omar desde
Dijo:
Gracias por el tip :)
Responder
hery desde
Dijo:
gracias por la info y el tuto
Responder
diego desde
Dijo:
me podrías informar donde pongo “if (($tipo==”aqui el mime que quieres que suban”))”
{
para que sean solo archivos application/pdf
y que cuando no es pdf indique ” solo arhivos PDF”ç
gracias!
Responder
Pablo desde
Dijo:
En la linea despues de obtener el tipo de archivo.
$tipo = $_FILES["foto"]["type"];
//NOS ASEGURAMOS QUE EL ARCHIVO SUBIDO SEA SOLO UNA IMAGEN Y NO OTRO TIPO DE ARCHIVO
if (($tipo==”application/pdf”))
{
…
} //cierre de la llave antes de iniciar la consulta.
//CREAMOS NUESTRO INSERT
Responder
NasfTTer desde
Te pasastes con el post, lo distes en la manos a todos los que buscan este tipo de info!
lo mejor hermano saludos!
Responder
cesar edinson desde
Execellente aportacion.. muxas gracias… lo recibire aver si despeja algunas dudas.. Saludoss—
Responder
JOSE desde
PERO POR QUE DICEN PELIGROS? SI EL ARCHIVO SUBE A ALA BAE DE DATOS Y NO A LA CARPETA DEL SERVIDOR
Responder
Imanol desde
Me parece una excelente aportación pero no logro ponerlo en marcha. Recibo el siguiente error:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ” at line 1 query::SELECT * FROM actasdue WHERE Id_documento =
Realmente me estoy quebrando la cabeza. ¿Saben alguno de ustedes a que se puede deber?
Muchas gracias de antemano
Responder
Juan desde
Como hago para que almacene mas de 1 mb gracias
Responder
cesar edinson desde
Dijo:
Fijate en el php.ini q este habilitado la opcion de 2M puebes subir hasta mas pero ese es el valor por defecto… en modo local Funciona de forma correcta
Responder
ruben desde
las imagenes que subes a el servidor donde se guardan?
Responder
Laura desde
Estoy haciendo un programa y no se si esto me funcioneee!!!! tambien ocupo bajar el php pero no se de donde!????????
Alguien que me ayude se me cierra el mundo!!!!
Responder
Ruben Omar desde
Hola Laura al final del articulo se encuentra el link de descarga que es este : http://blog.deliriumlabs.net/wp-content/uploads/upload.zip
Responder
Kechis desde
Hola, muchas gracias ante todo.
Necesitaba a ver si me pueden ayudar con un error q me da, y para comentarles un pequeño error q hay, en la linea 49 del upload.php el caracter extraño es un “<" por si alguien le ayuda.
Mi problema es q me da este error al abrir el archivo: list.php
Catchable fatal error: Object of class stdClass could not be converted to string in C:\xampp\htdocs\upload\list.php on line 52
la linea 52 es la del echo q pongo a continuacion:
echo "
id_documento}’>
//////////////Desde aqui
titulo’ src=’getfile.php?id_documento={$obj->id_documento}’/>
///////////Hasta aqui.
“;
Muchas gracias de antemano.
Responder
Kechis desde
Dijo:
Olvidadlo, me lo solucione yo mismo, sorry ^^
Responder
Kendall desde
Dijo:
Men queria saber como solucionaste ese problema, llevo días tratando de ver por que me sale ese error… Espero q me puedas ayudar
Responder
Sebastian desde
Dijo:
Hola como estas, me podrias explicar cual es el error de la linea 49 ? no se como arreglarlo y no entiendo cuando dices que es un “<" en vez del caracter extraño, cual caracter seria ?
Responder
Jheyson desde
Holas muy buen post, exelente ¡¡¡ vamoa a ver como keda ….
Responder
Andrei desde
Amigo gracias por el aporte…
Pero tengo un problema, no me ejecuta el archivo upload.php…
Lo que hace es abrirlo, como para abrir o guardar…
Te agradezco cualquier ayuda..
Responder
Andrei desde
Dijo:
Ya solucione el problema…
De todas maneras Gracias.
Responder
ASERCAP desde
xvr ahora mismo implementos este upload en mi web …
Responder
Ken desde
muy bueno, tengo el siguiente problema, al subir el archivo me da error en la linea 55 de upload.php
$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’)”;
aver si me ayudan =)
Responder
Patricia desde
Dijo:
Creo que te faltan los puntos en ‘.$descipcion.’ etc etc… para concatenar en php y string…
Saludos!
Responder
Patricia desde
Hola! mira lo que quiero hacer es seleccionar del list.php ciertos archivos y comprimirlos en zip, tengo como hacerlo para zip, pero tengo problemas de rescatar n archivos a la vez…
Gracias! excelente post :D
Saludos!
Responder
ernesto desde
Dijo:
tengo la misma inquietud.. no logro mostrar solo un archivo :s
Responder
ernesto desde
Dijo:
creo que donde hay que cambiar es aqui
$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 informe_personal AS docs";
Responder
ivan desde
com puedo subir multiples archivos?
Responder
mauricio desde
mi pregunta es la siguiente…
supongamos que quiero cargar mp3 y una imagen, como para hacer una presentación de la portada de un disco y sus canciones, las que se llaman desde un reproductor y (valga la redundancia) las reproduce.
probé esto para subir la imagen y anda fenomenalmente bien, luego intenté modificar el form para que en lugar de subir de a un solo archivo suba de a 5 pero el resultado es que me muestra el título, y al darle al enlace del título inmediatamente me quiere hacer bajar el archivo getfile.php
mi pregunta sería… ¿como se debe modificar para que acepte multiples uploads y que registre todo y no solo el título o trabajarlo de que manera para que se pueda hacer lo que digo?
Responder
Andres Aya desde
Hola, muy buen post, de hecho también lo estoy implementando en mi website, pero tengo una duda, puedo subir archivos de audio?
Responder
antonio desde
me da error el script, cuando hago clic en el boton registrar documento se me abre otra ventana con un montón de codigo que no entiendo…
Query: INSERT INTO tbl_documentos ( titulo,nombre_archivo, descripcion, contenido, tamanio,tamanio_unidad, tipo ) VALUES (‘s’,'CB1300_1.jpg’, ‘s’,'ÿØÿàJFIFddÿìDuckyÿîAdobedÀÿÛ„ #%\’%#//33//@@@@@@@@@@@@@@@&&0##0+.\’\'\’.+550055@@?@@@@@@@@@@@@ÿÀjô\”ÿÄ
sale eso pero mucho mas largo esto es solo un trozo.
Unsaludo
Responder
antonio desde
al final de lo que os he dicho me da este error,
alguien puede ayudarme?
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”uf’.,.’CB1300_1.jpg’.,.’dios mio’.,.’ÿØÿàJFIFddÿìDucky’ at line 2
Responder
Lily desde
El script esta bien estructurado funciono super bien, gracias por la informacion me ha sido de muchisima ayuda.
Saludos que Dios te bendiga.
Para solucionar los problemas revicen bien la parte de la conexion a su base de datos y en especial la parte en la que envian la consulta.
Responder
cursos de maquinaria pesada desde
exeletne aporte me estab matando la cabeza para subir un archiuvo a mi BD por la ….. ahora es mas facil con esto jejejje XDXDXDd….. atte: asercap maquinaria pesada
Responder
escuela de operadores de maquinaria pesada desde
muy bueno realmente loco esto e bien xvr para los que recien estamos empezando en este mundo de la web subir archivos y todo eso… atte Asercap
Responder
OMAR desde
EXCELENTE APORTE GRACIAS…
Responder
rosita desde
Hola…. me funciona el script… pero solo con imágenes inferiores a 1024, y el php.ini esta en 200M… nose donde modificarlo!!….
alguién me puede ayudar?
Responder
alejandro desde
Hola esta de pelos tu post intente modificarlo para que pudiera eliminar los archivos que lista pero no lo consegui sabras como?
Responder
Mariam Angelique desde
Muchas Gracias excelente post, funciono de maravilla!!!!!!
Responder
Jorge desde
Funciona de lujo, pero tengo muchos problemas para subir mas de 1 mega, tengo que cambiar el mysql o el php.ini??
He probado cambiado el max_allowed_packet de mysql pero no consigo nada
Responder
Saray desde
Dijo:
Hola,
Hay que modificar el php.ini, para que lo ubiques en tu servidor, crea un archivo info.php con el sig codigo:
Luego abre el link de donde hayas guardado el archivo: http://tudominio.com/info.php
ahí te abre una pagina con una tabla, donde dice: Configuration File (php.ini) Path
ahi te indica la ruta del archivo php.ini, en mi caso es /etc/php.ini
Lo buscas en tu servidor y lo abres, solo tienes que cambiar la parte que dice:
;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;
; Whether to allow HTTP file uploads.
file_uploads = On
; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
;upload_tmp_dir =
; Maximum allowed size for uploaded files.
upload_max_filesize = 2M //aquí cambias los megas//
Saludos
Responder
Saray desde
Dijo:
phpinfo();
el codigo del archivo
Responder
oscar desde
Estimado el formulario funciona bien pero cuando quiero ver no me abre me dice que el programa no lee mapa de bits.
gracias
equatore
Responder
oscar desde
buenas a todos el post esta super pero ya modifique el php.ini y no mme sube mas de 1mb que hago ayuupa porfavor y tambien queria sabeer si se puede paginar los resultados de los documentos obetnidos ya que necesito subir muchos y se ve feo todos en una misma pagina web
Responder
David desde
Miren yo tengo este codigo,ya me funciona pero me gustaria que alguien me ayudara cargar video en la base de datos.
Les dejo el link.Espero su respuesta.
http://galeon.com/david-juarez/bajar.html
Responder
Diego desde
buenas ! muy buena aplicación !
me faltaría poder borrar los registros! alguien lo tiene?
gracias de ante mano
D.
Responder
N4CH0 desde
gracias por el aporte, me gustaria saber como le puedo hacer para subir archivos multiples y luego guardarlos en una base de datos, espero tu respuesta gracias!!!
Responder
Saray desde
para borrarlos? desde la página
Responder
albert desde
alguien me puede ayudar de como puedo descar documento imagenes de la b.d con codigo de php.
Responder
Karl desde
Excelente aportación, trabaja a la primera y sin fallos. Felicidades.
Responder
Karl desde
Muy Buena programación, pero no me sale la descripcion, solo el título, que debo insertar en la consulta para ver la descripción?
Responder
luis86 desde
hola gracias por el aporte muy bueno me funciono pero tengo un problema una vez q muestra la lista de los documentos como hago para que una vez seleccionados empieze la descarga o sera q me equivoque en algo? plz si alguien sabe la respuesta se lo agradeceria saludos !!!!
Responder
lucas desde
excelente el aporte!!! Aunque tengo un problema: no me muestra ni el titulo ni la descripcion, solo el link de descarga.
Sube imagen y texto pero no da las descripciones ni titulos ni nada… porfa ayudaaaa…
Y gracias nuevamente
Responder
ana desde
hola quisiera saber como descar archivos con php y msql.. me urge mucho :S muchas gracias espero su respuesta…
Responder
ernesto desde
para que por medio de un numero de registro al cosultar, solo me aparezca un archivo que deberia de cambiarle..?
Responder