Saltar a: navegación, buscar

Insertar ficheros mysql


Revisión del 11:55 19 sep 2018 de Gerardo (discusión | contribuciones) (Gerardo trasladó la página Privado:Insertar ficheros mysql a Insertar ficheros mysql sin dejar una redirección)
(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)

Para insertar ficheros en la base de datos hay que verificar varias cosas primero.

Requisitos previos

Para poder subir ficheros antes hay que acondicionar el formulario. Esto se consigue añadiendo **enctype="multipart/form-data"** al <form> También es necesario añadir un campo <file> al formulario que permita adjuntar el fichero en cuestión.

<input type="file" name="fich" id="fich" />

Procesado del formulario

Una vez enviado el fichero PHP generará un array $_FILES que contendrá una entrada con clave 'fich' según el ejemplo anterior. En dicho array tendremos varios campos una vez enviemos el formulario:

print_r($_FILES);

Array
(
    [fich] => Array
        (
            [name] => Array
                (
                    [0] => 400.png  // Nombre que tenía el fichero cuando se subió
                )
            [type] => Array
                (
                    [0] => image/png  // Mimeype del fichero subido
                )
            [tmp_name] => Array
                (
                    [0] => /tmp/php5Wx0aJ  // Lugar físico del servidor donde se encuentra, este nombre es aleatorio
                )
            [error] => Array
                (
                    [0] => 0 //  Código de error
                )
            [size] => Array
                (
                    [0] => 15726  // Tamaño en bytes del fichero
                )
        )
)

Antes de procesarlo y enviarlo a la base de datos, debemos comprobar que el fichero que se ha subido es del tipo que queremos. De esta forma evitamos que se procesen ficheros php o potencialmente peligrosos. Para ello nos centraremos en la clave [type] dicha clave contiene el mimetype del archivo subido por lo que no nos centramos exclusivamente en la extensión sino en el contenido del fichero. También se pueden realizar comprobaciones de tamaño y extensión ya que se tienen todos los datos del fichero subido.

Una vez el fichero sea del tipo requerido, tenemos que meterlo en la base de datos. Para ello usaremos estas funciones:
$sqls="INSERT INTO mitabla (miimagen) VALUES ('".addslashes(file_get_contents($_FILES['tmp_name']))."')";

Este código lo que hará es obtener el contenido del fichero, protegerlo para que pueda ser procesado por mysql e insertarlo en la tabla.

Rescate del fichero

Como el fichero está integramente almacenado en la base de datos, para poder rescatarlo necesitaremos de un fichero php que se conecte a la base de datos, obtenga todo el contenido del fichero y lo muestre. Para ello deberemos conocer el tipo del fichero y enviar su correspondiente cabecera antes del contenido ya que de lo contrario el fichero saldrá mostrado en pantalla como si se tratara de un texto.

Para hacer esto, podemos almacenar la extensión en la misma tabla donde reside nuestro fichero y, dependiendo de la extensión, enviar una cabecera u otra. Nosotros, para ahorrarnos el tener que almacenar la extensión, lo hemos realizado consultando los códigos hexadecimales de la cabecera del fichero almacenado. En el siguiente ejemplo, se procesan ficheros rar, zip y pdf con sus cabeceras:


// ***************************************
// FUNCION QUE OBTIENE LOS PRIMEROS BYTES DE UNA CADENA
// ***************************************
function obtener_bytes_de_cadena_hex ($hexdata) {
   
  for($count = 0; $count < strlen($hexdata); $count+=2)
    $bytes[] = chr(hexdec(substr($hexdata, $count, 2)));

  return implode($bytes);

}

// ***************************************
// FUNCION QUE OBTIENE EL TIPO MIME DE UN FICHERO
// ***************************************
function obtener_mime_file ($filedata) {
   
  $mimetypes = array( 
    "application/x-rar-compressed" => "526172211A0700", 
    "application/zip" => "504B03041400",
    "application/pdf" => "25504446"
  );
  
  $extensiones = array( 
    "application/x-rar-compressed" => "rar", 
    "application/zip" => "zip",
    "application/pdf" => "pdf"
  );

  foreach ($mimetypes as $mime => $hexbytes) {
    $bytes = obtener_bytes_de_cadena_hex($hexbytes);
    if (substr($filedata, 0, strlen($bytes)) == $bytes) {
	    $arr_datos = array($mime,$extensiones[$mime]);
	    return $arr_datos;
    }
  }

  return NULL;

}


list($mimetype, $extension)=obtener_mime_file($row['dump']);
	
header("Content-type: ".$mimetype);
header("Content-disposition:  attachment; filename=".$contenido_fich.'.'.$extension);

Para obtener los códigos hexadecimales del tipo de fichero, en consola se usa el comando hexdump que devuelve todos el fichero en hexadecimal. Sólo hay que realizar el dump de varios ficheros del mismo tipo para ver que datos de la cabecera son comunes y usarlos en la función.

Códigos de error de subida

Estos son los posibles códigos de error que pueden darse al subir un fichero. Son constantes de PHP para que puedan ser reconocibles. Cada constante tiene un valor numérico:

 * UPLOAD_ERR_OK: 0 (No se ha producido ningún error)
 * UPLOAD_ERR_INI_SIZE: 1
 * UPLOAD_ERR_FORM_SIZE: 2
 * UPLOAD_ERR_NO_TMP_DIR: 6
 * UPLOAD_ERR_CANT_WRITE: 7
 * UPLOAD_ERR_EXTENSION: 8
 * UPLOAD_ERR_PARTIAL: 3