Vamos a ver cómo podemos guardar ficheros de nuestro ordenador en la base de datos mySQL de nuestro servidor.

Lo primero que tenemos que hacer es crear la base de datos. Nos centramos en la tabla que contendrá nuestro archivo. La sentencia SQL para crear el archivo será:

CREATE TABLE Fichero(
id INT NOT NULL AUTO_INCREMENT,
contenido MEDIUMBLOB NOT NULL,
nombre VARCHAR(100) NOT NULL,
extension VARCHAR(5) NOT NULL,
titulo VARCHAR(120),
tamano INT NOT NULL,
PRIMARY KEY (id)) TYPE=INNODB;

El contenido del archivo se almacenará en el campo 'contenido', que es de tipo MEDIUMBLOB (permite almacenar archivos de hasta 16 MB).

Veamos ahora nuestro formulario:

<form enctype="multipart/form-data" action=''$PHP_SELF" method='post'>

<label for='fichero'>Fichero a guardar:</label>
<input type='file' name='userfile' id='fichero'/>

<input type='submit' value='Enviar fichero'>

</form>

Para tratar el fichero que subimos, utilizamos el array $_FILES ($HTTP_POST_FILES p ara versiones anteriores a PHP 4.1.0) que contiene la información sobre el archivo enviado.

Para describir el contenido de $_FILES, veremos unos ejemplos con el valor 'userfile' como nombre de fichero (al igual que en el formulario).

$_FILES['userfile']['name']: nombre original del fichero en la máquina cliente

$_FILES['userfile']['type']: tipo MIME del fichero

$_FILES['userfile']['size']: tamaño en bytes del fichero

$_FILES['userfile']['tmp_name']: nombre del fichero temporal que se utiliza para almacenar en el servidor el archivo recibido.

Podemos comprobar facilmente si un archivo ha sido cargado a través de HTTP POST con la función is_uploaded_file($_FILES['userfile']['tmp_name']).

Por último, podemos hacer una función como la siguiente para almacenar los datos en la base de datos:

function addFichero(){
/*Recupero los datos característicos para introducirlos en la base de datos*/

$nombre = $_FILES['userfile']['name'];
$ext = $_FILES['userfile']['type'];
$tam = $_FILES['userfile']['size'];

$fp = fopen($_FILES['userfile']['tmp_name'], "rb");
$contenido = fread($fp, $tam);
$contenido = addslashes($contenido);
fclose($fp);

/* Guardo los datos en la base de datos */
$sql = "INSERT INTO Fichero VALUES('', '$contenido', '$nombre', '$ext', '', '$tam')";
if (!mysql_query ($sql))
die("Error al añadir el fichero");
else
echo "Se ha guardado correctamente el archivo";
}

Es posible que necesitemos subir más de un archivo a nuestro servidor en un único formulario. Para ello, podemos usar un array para que sea más sencillo manejarlos:

<form enctype="multipart/form-data" action=''$PHP_SELF" method='post'>

<p>Subir estos archivos:</p>
<input type='file' name='userfile[]'/>
<input type='file' name='userfile[]'/>

<input type='submit' value='Enviar fichero'>

</form>

De esta manera, almacenamos los ficheros como un array, al que podemos acceder así:

$_FILES['userfile']['name'][0] , $_FILES['userfile']['name'][1] , etc...

Puedes encontrar más información en:

  • http://es.php.net/manual/es/features.file-upload.php
  • http://es2.php.net/manual/es/function.is-uploaded-file.php