Datos BLOB con PHP y mySQL

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

4 Responses to “Datos BLOB con PHP y mySQL”

  1. Loren says:

    Muy interesante Anita. Hay una función que no entiendo por qué es necesaria:

    $contenido = addslashes($contenido);

    Qué hace el addslashes o más bien, por qué es necesaria? (lo que hace me lo imagino)

    Muy chulo tu primer post y espero que haya muchos más así :-)

    Nota: ya tienes tu wordpress actualizado

  2. admin says:

    Hola Loren!

    La función addslashes sirve para escapar los caracteres comilla simple, comilla doble, barra invertida y NULL.

    Para ver por qué es necesario escapar la información que introducimos en la base de datos, piensa por ejemplo que quieres almacenar la cadena

    Vamos a ver un concierto de “‘Queens of the Stone Age”

    Como sabes, cuando vamos a introducir este texto en la consulta, tenemos que meterlo todo entre comillas, por lo que es necesario escapar las comillas de “Queens of the Stone Age” para que la consulta se ejecute correctamente.

    Bueno, realmente en este caso podríamos alternar comillas dobles para englobar toda la frase, y comillas simples para el nombre del grupo, pero cuando se trata de un texto subido de un archivo, en el que desconocemos el contenido, lo más seguro es hacerlo con la función addslashes.

  3. Loren says:

    Aah, ya veo.

    Entonces supongo que hay una función inversa y que ha de utilizarse al sacar los datos de la base de datos.

  4. admin says:

    Sii, así es.

    La función es stripslashes, y hace la conversión contraria, quita todas las barras que metíó addslashes para escapar el contenido.

    Te dejo el enlace de la función stripslashes:
    http://es.php.net/manual/es/function.stripslashes.php

Leave a Reply