Directorios y Subidas
Subir un archivo significa enviar un fichero desde el ordenador del usuario hasta el servidor donde se aloja nuestra página web. El procedimiento, visto por el usuario, es tan sencillo como seleccionar un fichero en un formulario y darle a enviar. En el otro lado, visto por el desarrollador, no es mucho más complicado. Vamos a ver cómo.
Lo primero es crear un formulario donde alojar el componente que nos permitirá seleccionar ficheros, un "input" de tipo "file".
<form method="post" action="upload.php" enctype="multipart/form-data">
         ¡Sube tu foto!: <input type="file" name="foto" /> <input type="submit" name="enviar" value="Enviar" />
      </form>
MUY IMPORTANTE: El atributo enctype="multipart/form-data" tiene que estar siempre que queramos subir un fichero, de lo contrario no se subirá ningún archivo. Es bastante habitual olvidarse de este atributo y perder un valioso tiempo viendo qué pasa.
La parte HTML ya la tenemos lista, es un sencillo formulario con un campo para subir un fichero y un botón de envío. Como se puede observar, hemos indicado que los datos del formulario se envien al fichero "upload.php". A continuación vamos a ver qué debería contener ese fichero.
<?php
move_uploaded_file($_FILES['foto']['tmp_name'],'imagenes/upload/'.$FILES['foto']['name']);
?>
Así de sencillo, solamente hay que usar la función move_uploaded_file indicándole cual es el fichero que se ha subido como primer parámetro, y la ruta donde queremos guardarlo como segundo parámetro. En este caso hemos subido el fichero que hemos enviado a través del campo con nombre "foto" y lo hemos guardado en "imagenes/upload/". Obviamente, hay que crear este directorio y darle permisos de escritura (777) para que PHP pueda almacenar el fichero.
En esta línea de código hay otra cosa muy importante para manejar las subidas de ficheros, el array $_FILES. Este array contiene información sobre los ficheros subidos y es el que usamos para obtener el nombre temporal con el que se ha subido el fichero y su nombre real para copiarlo en el directorio de destino.
El contenido de $_FILES es el siguiente:
- tmp_name: Es el nombre del fichero temporal donde se ha hecho el upload.
- name: Es el nombre original del fichero, el que le puso el usuario.
- type: El tipo mime del fichero. Por ejemplo si es una imagen jpeg el valor de esta clave será "image/jpeg"
- error: Indica si ha habido algún error durante la subida.
- size: Tamaño del fichero en bytes.
Por lo tanto lo que hemos hecho en el código anterior ha sido mover el fichero desde su ubicación temporal (tmp_name) hasta un directorio que nosotros hemos elegido (imagenes/upload) usando el nombre original del fichero (name).
Algunos servidores al subir un fichero automáticamente asignan unos permisos que impiden que se puedan ver desde la web, en este caso podemos usar la función chmod para cambiar los permisos a por ejemplo 644.
<?php
move_uploaded_file($_FILES['foto']['tmp_name'],'imagenes/upload/'.$FILES['foto']['name']);
chmod('imagenes/upload/'.$FILES['foto']['name'],0644);
?>
Las rutas de los archivos que se deben editar son: 
nano /etc/php5/apache2/php.ini 
nano /etc/php5/cgi/php.ini
Los campos a editar son los siguientes:
Configuración de PHP para subir archivos
El archivo de configuración php.ini contiene directivas para autorizar o desautorizar el envío de archivos por medio de un formulario y también configurarlo:
file_uploads= On/Off permite autorizar o desautorizar el envío de archivos.
upload_tmp_dir = directorio permite definir el directorio temporal donde se colocará el archivo cargado.
upload_max_filesize = 2M permite definir el tamaño máximo autorizado del archivo. Si este límite es sobrepasado, el servidor enviará un código de error.
post_max_size indica el tamaño máximo de los datos enviados en un formulario. Esta directiva prima sobre upload_max_filesize, por lo que hay que asegurarse de tener post_max_size supeior a upload_max_filesize
Si no tiene acceso a la configuración (caso de un sitio web alojado en el servidor del proveedor de acceso o en el caso de un alojamiento mutualizado), entonces puede verificar la configuración con la función phpinfo():
<?
  phpinfo();
?>

 
No hay comentarios:
Publicar un comentario