Sei sulla pagina 1di 11

Cargar archivos a la base de datos MySQL

[Editar etiquetas]

Uso de PHP para subir archivos en bases de datos MySQL a veces se necesita por alguna aplicacin web. Por ejemplo, para el almacenamiento de documentos PDF o imgenes para hacer som tipo de portafolios en lnea (como el maletn de Yahoo). Para el primer paso, vamos a hacer la tabla de la carga de archivos. La tabla de contenido concreto. 1. 2. 3. 4. 5. id: identificador nico para cada archivo Nombre: Nombre de archivo Tipo: Tipo de contenido Tamao: Tamao del archivo contenido: El archivo

De contenido de la columna utilizaremos tipo de datos BLOB. BLOB es un objeto binario que puede contener una cantidad variable de datos. MySQL tiene cuatro tipos de datos BLOB, que son:
y y y y

TINYBLOB BLOB MEDIUMBLOB LONGBLOB

Desde BLOB se limita a almacenar hasta 64 kilobytes de datos vamos a utilizar MEDIUMBLOB para que podamos almacenar grandes archivos (hasta 16 megabytes). CREATE TABLE de carga ( Identificacin del NO INT NULL AUTO_INCREMENT, nombre VARCHAR (30) NOT NULL, tipo VARCHAR (30) NOT NULL, tamao NOT NULL INT, MEDIUMBLOB contenido NOT NULL, PRIMARY KEY (id) ); Cargar un archivo en MySQL es un proceso de dos pasos. Primero que hay que cargar el archivo en el servidor y luego leer el archivo e insertar a MySQL. Para cargar un archivo que necesitamos una forma para que el usuario introduzca el nombre del archivo o navegar por su ordenador y seleccione el archivo. El input type = "file" se utiliza para ese fin. Ejemplo: upload.php El cdigo fuente: upload.phps <form method="post" enctype="multipart/form-data"> <table width="350" border="0" cellpadding="1" cellspacing="1" class="box">

<tr> <td width="246"> <input type="hidden" name="MAX_FILE_SIZE" value="2000000"> <input name="userfile" type="file" id="userfile"> </ Td> <td width="80"><input type="submit" name="upload" class="box" id="upload" value=" Subir "></ td> </ Tr> </ Table> </ Form> Un formulario de carga debe tener encytype = "multipart / form-data" de lo contrario no funcionar en absoluto.Por supuesto, el mtodo de formulario tambin es necesario establecer a method = "post". Asimismo, recuerda a poner un MAX_FILE_SIZE entrada oculta antes de que el archivo de entrada. Es para restringir el tamao de los archivos. Despus se enva el formulario al que tenemos que leer la autoglobal $ _FILES. En el ejemplo anterior el nombre de entrada para el archivo se userfile lo que el contenido de $ _FILES son as: $ _FILES ['Userfile'] ['name'] El nombre original del archivo en la mquina cliente. $ _FILES ['Userfile'] ['type'] El tipo mime del archivo, si el navegador proporciona esta informacin. Un ejemplo podra ser "image / gif". $ _FILES ['Userfile'] ['size'] El tamao en bytes del archivo subido. $ _FILES ['Userfile'] ['tmp_name'] El nombre del archivo temporal del archivo en el que el archivo subido se almacena en el servidor. $ _FILES ['Userfile'] ['error'] El cdigo de error asociado a esta carga de archivos. ['Error'] fue agregado en PHP 4.2.0

Ejemplo: upload.php <? Php if (isset ($ _POST ['upload']) && $ _FILES ['userfile'] ['size']> 0) { $ Archivo = $ _FILES ['userfile'] ['name']; $ TmpName = $ _FILES ['userfile'] ['tmp_name']; Tamao: $ $ _FILES ['userfile'] ['size']; $ TipoArchivo = $ _FILES ['userfile'] ['type'];

$ Fp = fopen ($ tmpName, 'r'); $ Contenido = fread ($ fp, filesize ($ tmpName)); $ Contenido = addslashes ($ contenido); fclose ($ fp); if (! get_magic_quotes_gpc ()) { $ Archivo = addslashes ($ archivo); } incluir "la biblioteca / config.php '; incluir "la biblioteca / opendb.php; $ Query = "INSERT INTO subir (nombre, tamao, tipo de contenido)". "VALUES ('$ archivo', '$ Tamao', '$ tipoArchivo', '$ contenido')"; mysql_query ($ query) or die ('Error, no consulta'); incluir "la biblioteca / closedb.php; echo "El archivo <br> $ fileName subida"; } > Antes de hacer nada con el fichero. Usted no debe asumir que el archivo se ha subido correctamente al servidor. Siempre revise para ver si el archivo se ha subido correctamente observando el tamao del archivo. Si es mayor que cero bytes, entonces podemos suponer que el archivo se ha subido correctamente. PHP guarda el archivo subido con un nombre temporal y guardar el nombre en $ _FILES ['userfile'] ['tmp_name'].Nuestra siguiente tarea es leer el contenido de este archivo e insertar el contenido de la base de datos. Siempre asegrese de que utilice addslashes () para escapar de los contenidos. Addslashes usando () para el nombre del archivo tambin se recomienda porque nunca se sabe lo que el nombre del archivo ser. Eso es que ahora usted puede subir sus archivos a MySQL. Ahora es el momento de escribir el guin para descargar los archivos.

Descarga de ficheros desde la base de datos MySQL


Cuando se carga un archivo en la base de datos tambin guardar el tipo de archivo y la longitud. Estos no eran necesarios para cargar los archivos, pero es necesario para descargar los archivos de la base de datos. La lista de pgina de descarga de los nombres de archivos almacenados en la base de datos. Los nombres estn impresos en una url. La URL se vera download.php? Id = 3. Para ver un ejemplo de trabajo, haga clicaqu. salv varias imgenes en mi base de datos, usted puede intentar descargarlos.

Ejemplo: <html> <head> <title> descarga de archivos de MySQL</ title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </ Head> <body> <? Php incluir "la biblioteca / config.php '; incluir "la biblioteca / opendb.php; $ Query = "SELECT id, nombre DE subir"; $ Result = mysql_query ($ query) or die ('Error, no consulta'); if (mysql_num_rows ($ resultado) == 0) { echo "Base de datos es <br> vaco"; } ms { while (list ($ id, $ nombre) = mysql_fetch_array ($ resultado)) { > <A href = "download.php? Id = <?Php $ id = ;?>"><? php = $ nombre ;?></ a> <br> <?Php } } incluir "la biblioteca / closedb.php; > </ Body> </ Html>
Al hacer clic en el enlace de descarga, el $ _GET ['id'] se ajustar. Podemos utilizar este id para identificar los archivos que se obtiene de la base de datos. A continuacin se muestra el cdigo de descarga de archivos de base de datos MySQL. Ejemplo: <? Php if (isset ($ _GET ['id'])) { / / Si la ID se establece a continuacin, obtener el fichero con el ID de la base de datos incluir "la biblioteca / config.php '; incluir "la biblioteca / opendb.php; $ Id = $ _GET ['id']; $ Query = "SELECT nombre, tipo, tamao, contenido".

"DESDE subir WHERE id = '$ id'"; $ Result = mysql_query ($ query) or die ('Error, no consulta'); list ($ nombre, $ tipo, $ size, $ contenido) = mysql_fetch_array ($ resultado); header ("Content-Length: $ size"); header ("Content-type: $ tipo"); header ("Content-Disposition: attachment; filename = $ nombre"); echo $ contenido; incluir "la biblioteca / closedb.php; salida; } > Antes de enviar el contenido del archivo con el primer eco que necesitamos para establecer varios encabezados.Ellos son: 1. header ("Content-Length: $ size") Esta cabecera indica al navegador el tamao del archivo es. Algunos navegadores lo necesitan para poder descargar el archivo correctamente. De todos modos es una buena manera diciendo el tamao del archivo es. De esta manera cualquier persona que descargue el archivo se puede predecir cunto tiempo tomar la descarga. 2. header ("Content-type: $ tipo") Esta cabecera le dice al navegador qu tipo de archivo que intenta descargar. 3. header ("Content-Disposition: attachment; filename = $ nombre"); Indica al navegador que guarde el archivo descargado con el nombre especificado. Si no enva esta cabecera el navegador tratar de guardar el archivo con el nombre del script (download.php). Despus de enviar el archivo de la secuencia de comandos no se ejecuta llamando a la salida. NOTA: Al enviar las cabeceras del mensaje de error ms comn que se ve es algo como esto: Advertencia: No se puede modificar la informacin de cabecera - cabeceras ya enviado por (la produccin comenz en C: \ Webroot \ biblioteca \ config.php: 7) en C: \ Webroot \ download.phpon line 13 Este error se produce debido a que algunos datos han sido enviados ya antes de enviar la cabecera. En cuanto al mensaje de error anterior que se debe a que i "accidentalmente" aadir un espacio a la derecha despus de la etiqueta de cierre PHP (>) en el archivo config.php. As que si usted esta viendo este mensaje de error cuando se est enviando una cabecera slo asegrese de que no tienen todos los datos enviados antes de llamar a header (). Revise el expediente mencionado en el mensaje de error e ir al nmero de lnea especificado

Carga, almacenamiento y descarga de datos binarios en una base de datos MySQL


por Joao Prado Maia 09/15/2000

Este artculo est dirigido a responder a una de las preguntas ms frecuentes sobre la lista de correo de PHP y foros de discusin por igual: Cmo guardar archivos binarios en una base de datos MySQL. Me encontr con esta misma pregunta cuando se le pregunt por un posible empleador prueba mis habilidades de programacin para crear un conjunto de scripts para subir archivos a una base de datos MySQL, descargar archivos del mismo, y tambin muestran una imagen, si el archivo era de hecho una imagen. De todos modos, no pude encontrar ningn artculo sobre la manera de hacer eso, as que busqu un montn en las listas de correo de PHP para encontrar mi respuesta. Este artculo es mi manera de "devolver" a la comunidad. :) Puedo dividir el artculo en tres pginas,

y y y

La creacin de la base de datos La creacin de la 'upload' scripts La creacin de la 'descarga' script

as que todo puede ser explicado en el momento correcto, y tambin porque aade algunas caractersticas adicionales, como un guin de descarga para obtener los archivos binarios de nuevo a partir de la base de datos. Esto es muy til para descargar archivos de diferentes tipos a partir de una base de datos de empresa, o incluso visualizar las imgenes almacenadas en campos BLOB.

La creacin de la base de datos


Doy instrucciones para bases de datos MySQL, ya que fue la base de datos que utiliza en el desarrollo de mi aplicacin web. Antes de salir, tengo que explicar lo que es un campo BLOB. Como un profesor deca: "Un BLOB es un b l inaryarge ob jeto que puede contener una cantidad variable de datos." En esencia, esto significa que es un tipo de datos BLOB que puede almacenar contenido binario, y podemos usarlo para almacenar archivos. Con el fin de establecer nuestra base de datos, debemos optimizar los campos de nuestras tablas para no perder los recursos. Esto significa que usted no debera usar un campo LONGBLOB cuando slo se necesita cargar los archivos de 1,5 Kb.Citando de la documentacin de MySQL en lnea :

y y y y

TINYBLOB - Una columna BLOB con longitud mxima de 255 (2 8 - 1) caracteres. BLOB - Una columna BLOB con longitud mxima de 65.535 (2 16 - 1) caracteres. MEDIUMBLOB - Una columna BLOB con longitud mxima de 16,777,215 (2 ^ 24 - 1) caracteres. LONGBLOB - Una columna BLOB con longitud mxima de 4,294,967,295 (2 32 - 1) caracteres.

Para la mayora de las aplicaciones, un campo MEDIUMBLOB es ms que suficiente, ya que puede contener hasta 15 megas de datos binarios. De todos modos, vamos a crear la base de datos y tablas de nuestra aplicacin web. Tenemos que conectar con el servidor MySQL:

mysql -u root -p Introduce el password: ******


Si el servidor se est ejecutando en otra mquina, utilice la siguiente:

mysql -u root -h hostname -p Introduce el password: ******


Ahora, para crear la base de datos actual:

mysql> CREATE DATABASE binary_files; Query OK, 1 row affected (0.00 sec)
Ok, ahora tenemos una base de datos para jugar. Podemos crear las tablas ahora.

mysql> CREATE TABLE tbl_Files ( >id_filestinyint(3) unsigned NOT NULL auto_increment, >bin_datalongblob NOT NULL, > description tinytext NOT NULL, > filename varchar(50) NOT NULL, >filesizevarchar(50) NOT NULL, >filetypevarchar(50) NOT NULL, > PRIMARY KEY (id_files) > );
Ahora tenemos que crear un usuario personalizado para esta base de datos / aplicaciones para una mxima seguridad:

mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER > ON binary_files.* > TO binary_user@localhost> IDENTIFIED BY 'binary_password';
Esoestodo. Ahora podemos conectar con el servidor de Apache / PHP usando el usuario binary_user y contrasea binary_password . No me cree? Comprubalo por ti mismo!

Creando los scripts de carga


Para hacer lo ms fcil, he creado un open_db.inc archivo de inclusin, por lo que no tiene que seguir usando el mismo cdigo para conectarse a un servidor y seleccione la base de datos. Soy un programador perezoso, y usted debe ser un tambin!

Ver el contenido de open_db.inc. Este script siguiente se utiliza para cargar un archivo en la base de datos. Siempre tienes que comprobar la variable ( $binFile ) para los contenidos. Cada vez que alguien acaba de xitos como "Sube" sin seleccionar un archivo, el archivo de entrada variable de campo tendr "ninguna". Tambin tenemos que hacer un cheque extra de seguridad sobre el contenido binario de s mismo, ya que puede contener algunos caracteres extraos que necesitan una barra. Esto puede acabar con nuestra declaracin de SQL, por lo que addslashes() es! Ver el contenido de add.php. Estamos utilizando el mismo guin para manejar tanto las acciones: subir un nuevo archivo y muestra el formulario para agregar la informacin relacionada con este nuevo archivo. El campo de entrada oculto llamado MAX_FILE_SIZE en el formulario que se necesita para que el cliente

puede limitar el tamao del archivo de los archivos nuevos. Adems, no se olvide de aadir el atributo adicionalENCTYPE="multipart/form-data" al formulario, o bien el guin no va a funcionar en absoluto. Bueno, que pareca casi demasiado fcil, verdad? Ahora lo que tenemos que hacer es crear el script de descarga, as como el guin que muestra la lista de archivos que estn actualmente en la base de datos. Pgina siguiente: Crear los scripts de descarga

Open.db.inc <?php $db = mysql_connect("localhost", "binary_user", "binary_password"); mysql_select_db("binary_files", $db) or die(mysql_errno() . ": " . mysql_error() . "<br>"); ?>

Add.php
<?php if ($action == "upload") { // ok, let's get the uploaded data and insert it into the db now include "open_db.inc"; if (isset($binFile) && $binFile != "none") { $data = addslashes(fread(fopen($binFile, "r"), filesize($binFile))); $strDescription = addslashes(nl2br($txtDescription)); $sql = "INSERT INTO tbl_Files "; $sql .= "(description, bin_data, filename, filesize, filetype) "; $sql .= "VALUES ('$strDescription', '$data', "; $sql .= "'$binFile_name', '$binFile_size', '$binFile_type')"; $result = mysql_query($sql, $db); mysql_free_result($result); // it's always nice to clean up! echo "Thank you. The new file was successfully added to our database.<br><br>"; echo "<a href='main.php'>Continue</a>"; } mysql_close(); } else { ?> <HTML> <BODY> <FORM METHOD="post" ACTION="add.php" ENCTYPE="multipart/form-data"> <INPUT TYPE="hidden" NAME="MAX_FILE_SIZE" VALUE="1000000"> <INPUT TYPE="hidden" NAME="action" VALUE="upload"> <TABLE BORDER="1"> <TR> <TD>Description: </TD> <TD><TEXTAREA NAME="txtDescription" ROWS="10" COLS="50"></TEXTAREA></TD> </TR> <TR> <TD>File: </TD> <TD><INPUT TYPE="file" NAME="binFile"></TD>

</TR> <TR> <TD COLSPAN="2"><INPUT TYPE="submit" VALUE="Upload"></TD> </TR> </TABLE> </FORM> </BODY> </HTML> <?php } ?>

Creando los scripts de descarga


En primer lugar vamos a crear el guin para mostrar la lista de archivos en la actualidad en nuestra mesa, y entonces podemos empezar a trabajar en el guin para descargar los archivos.

Ver el contenido de main.php. Esto debera crear una mesa limpia y hermosa, con todos los archivos sobre la mesa. Para una aplicacin real, es probable que desee limitar el nmero de archivos que se muestran aqu, y tambin hacer algo de formato en el tamao del archivo y los campos de tipo de archivo. Voy a dejar esto como un ejercicio para el lector. Vamos a ir a la secuencia de comandos de descarga gratuita.Es muy simple, y se va a trabajar con cualquier tipo de archivo dentro de la base de datos. Cada vez que los usuarios hacen clic en "Descargar" enlaces, un dilogo de descarga se abrir con el nombre viene de la base de datos. Ver el contenido de download.php. A veces, en otras secuencias de comandos, archivos de texto (. Txt) o incluso las imgenes se muestran en la ventana del navegador, en lugar de abrir el dilogo de descarga. Esto se debe a la cabecera HTTP " Content-Disposition: ", que tiene que tener algo reconocible como el primer argumento. Si usted pone un tipo MIME reconocible ah, como una imagen de tipo MIME, el navegador intenta abrirlo en la ventana. Lo mismo ocurre con los archivos de texto o cualquier otro tipo de archivo que el navegador pueda reconocer. Muchas veces la gente se pregunta cmo pudo saber el nmero de descargas de cada archivo. Este script puede modificarse fcilmente para realizar el seguimiento del "hits", e incluso se podra crear un script adicional para mostrar las estadsticas de cada archivo. Divertirse y seguir escribiendo! Joao Prado Maia es un desarrollador web que viven en Houston con ms de cuatro aos de experiencia desarrollando aplicaciones basadas en web y le encanta aprender nuevas tecnologas y lenguajes de programacin.

main <?php include "open_db.inc"; $sql = "SELECT * FROM tbl_Files "; $sql .= "ORDER BY filename ASC"; $result = mysql_query($sql, $db); $rows = mysql_num_rows($result); echo echo echo echo echo echo echo echo "<table>\n"; " <tr>\n"; " <td>Filename</td>\n"; " <td>Type</td>\n"; " <td>Size</td>\n"; " <td>Description</td>\n"; " <td> </td>\n"; " </tr>\n";

for ($i = 0; $i < $rows; $i++) { $data = mysql_fetch_object($result); // since our script is very small, i'm not going to escape out to html mode here echo " <tr>\n"; echo " <td>$data->filename</td>\n"; echo " <td>$data->filetype</td>\n"; echo " <td>$data->filesize</td>\n"; echo " <td>" . stripslashes($data->description) . "</td>\n"; echo " <td>( <a href='download.php?id=$data->id_files'>Download</a> )</td>\n"; echo " </tr>\n"; } mysql_free_result($result); mysql_close($db); ?>

download
<?php if ($id_files) { include "open_db.inc"; $sql = "SELECT bin_data, filetype, filename, filesize FROM tbl_Files WHERE id_files=$id_files"; $result $data = $name = $size = $type = = @mysql_query($sql, $db); @mysql_result($result, 0, "bin_data"); @mysql_result($result, 0, "filename"); @mysql_result($result, 0, "filesize"); @mysql_result($result, 0, "filetype");

header("Content-type: $type"); header("Content-length: $size"); header("Content-Disposition: attachment; filename=$name"); header("Content-Description: PHP Generated Data"); echo $data; } ?>

Potrebbero piacerti anche