Diferencia entre revisiones de «Plantilla:PHP/Formularios/transmisionFicheros»
De WikiEducator
Línea 52: | Línea 52: | ||
# '''''tpm_name''''' Nombre asignado de forma temporal en el servidor | # '''''tpm_name''''' Nombre asignado de forma temporal en el servidor | ||
# '''''error''''' Error que se haya podido producir o 0 si no ha habido ninguno (Ver tabla más abajo) | # '''''error''''' Error que se haya podido producir o 0 si no ha habido ninguno (Ver tabla más abajo) | ||
+ | |||
+ | |||
+ | Con el fichero que viene del cliente, en el servidor podemos hacer: | ||
+ | #Capturar el fichero y dejarlo en un directorio concreto | ||
+ | #Ver si se ha producido algún error especificando el código de error mediante una constante numérica | ||
+ | #Ver el tamaño del fichero | ||
+ | #Analizar el tipo de fichero para poder por ejemplo aceptarlo o descartarlo o decidir en qué carpeta dejarlo en función del tipo | ||
+ | =====Copiando el fichero a una carpeta===== | ||
+ | *La primera acción será copiarnos el fichero en una ubucación concreta dentro de nuestro servidor | ||
+ | *Lógicamente primero deberemos crear esa carpeta y asegurarnos que tenga permisos de escritura en ella el usuario apache (normalmente www-data) | ||
+ | *En el servidor tenemos el fichero disponible de forma temporal en la capeta /tmp. Podemos acceder a esta información en el elemento '''''$_FILES['tmp_name']''''' | ||
+ | *Para copiarlo usaremos la función '''''move_uploaded_file($origen, $destino);''''', dónde '''''$origen''''' es el fichero que queremos copiar con ubicación y $destino es la ubicación y nombre de fichero donde queremos dejarlo. | ||
+ | *Lo más habitual es dejar el fichero con el mismo nombre que tenía en el cliente, esta información la tenemos disponible en el atributo '''''$_FILES['name']''''' | ||
+ | *La función '''''move_upload(..)''' retorna un booleano que indica el éxito o fracaso de la acción http://php.net/manual/es/function.move-uploaded-file.php. | ||
+ | *A continuación un resumen de estas acciones | ||
+ | <source lang=php> | ||
+ | //Suponemos en el cliente | ||
+ | //... <input type=file name= fichero> | ||
+ | // | ||
+ | //Accedemos al fichero que está de forma temporal en el servidor | ||
+ | $origen = $_FILES['fichero']['tmp_name']; | ||
+ | /Accedemos al nombre del fichero con el que el cliente lo subió | ||
+ | $nombreFichero = $_FILES['fichero']['name']; | ||
+ | //Establecemos la ruta donde queremos dejar el fichero | ||
+ | //En este caso en la carpeta del proyecto tenemos una carpeta llamada descargas con permiso de escritura para www-data | ||
+ | $destino ="./descargas/".$nombreFichero | ||
+ | //Ahora procedemos a copiar y ver el éxito o fracaso | ||
+ | if (move_uploaded_file($origen, $destino)) | ||
+ | echo ("El fichero $nombreFichero se ha subido correctamente"); | ||
+ | else | ||
+ | echo ("Error subiendo el fichero $nombreFichero"); | ||
+ | </source> | ||
+ | =====Comprobando errores===== | ||
+ | * '''''$_FILES[error]''''' contiene información del error que se ha podido producir al subir el fichero | ||
+ | *La siguiente tabla es la lista de los posibles valores que va a haber en este elemento del array superglobal $_FILES | ||
[[Imagen:inputFilePhp.png]] | [[Imagen:inputFilePhp.png]] | ||
{|style="width:65%" height:200px" border="1" cellpadding="5" cellspacing="0" align="center" | {|style="width:65%" height:200px" border="1" cellpadding="5" cellspacing="0" align="center" | ||
Línea 76: | Línea 111: | ||
|align="center"| '''''UPLOAD_ERR_NO_FILE''''' | |align="center"| '''''UPLOAD_ERR_NO_FILE''''' | ||
|align="center"| ''No se subió ningún fichero.'' | |align="center"| ''No se subió ningún fichero.'' | ||
− | |||
− | |||
− | |||
− | |||
|- | |- | ||
|align="center"| 6 | |align="center"| 6 | ||
Línea 96: | Línea 127: | ||
http://php.net/manual/es/features.file-upload.errors.php | http://php.net/manual/es/features.file-upload.errors.php | ||
}} | }} | ||
+ | *Un posible código para obtener esta información | ||
+ | <source lang=php> | ||
+ | //Suponemos en el cliente | ||
+ | //... <input type=file name= fichero> | ||
+ | |||
+ | $fichero = $_FILES['fichero']; | ||
+ | ..... | ||
+ | $error = $fichero['error'] | ||
+ | //Esto es igual que hacer $error = $_FILES['fichero']['error'] | ||
+ | |||
+ | $error = $_FILES['error']; | ||
+ | switch ($error){ | ||
+ | case 0: | ||
+ | echo "ERROR. Fichero subido de forma correcta. <br />"; | ||
+ | break; | ||
+ | case 1: | ||
+ | echo "ERROR. Tamaño de fichero superior al establecido en el servidor <br />"; | ||
+ | |||
+ | break; | ||
+ | case 2: | ||
+ | echo "ERROR. Tamaño de fichero superior al establecido en cliente<br />"; | ||
+ | echo "El tamaño se estableción en el input MAX_FILE_SIZE<br/>"; | ||
+ | echo "Tamaño establecido ".$_POST['MAX_FILE_SIZE']."<br/>"; | ||
+ | break; | ||
+ | case 3: | ||
+ | echo "ERROR. EL fichero sólo se subió parcialmente <br/>"; | ||
+ | break; | ||
+ | case 4: | ||
+ | echo "ERROR. No se subión ningún fichero <br/>"; | ||
+ | break; | ||
+ | case 6: | ||
+ | echo "ERROR. No se encuentra la carpeta temporal <br/>"; | ||
+ | break; | ||
+ | case 7: | ||
+ | echo "ERROR. No se pudo escribir en disco. revisa permisos <br/>"; | ||
+ | break; | ||
+ | case 8: | ||
+ | echo "ERROR. Una extensión de php detuvo la subida del fichero <br/>"; | ||
+ | break; | ||
+ | default: | ||
+ | echo "Valor de error desconocido"; | ||
+ | } | ||
+ | |||
+ | </source> | ||
− | |||
− | |||
− | |||
#Ver el tamaño del fichero | #Ver el tamaño del fichero | ||
#Analizar el tipo de fichero para poder por ejemplo aceptarlo o descartarlo o decidir en qué carpeta dejarlo en función del tipo | #Analizar el tipo de fichero para poder por ejemplo aceptarlo o descartarlo o decidir en qué carpeta dejarlo en función del tipo | ||
− | + | ||
− | + | ||
− | + | ||
*Una vez presionado el submit en el cliente el fichero se copia en un fichero en una carpeta temporal | *Una vez presionado el submit en el cliente el fichero se copia en un fichero en una carpeta temporal |
Revisión de 10:33 1 nov 2016
Contenido
Transfirieno ficheros entre clinte y servidor
- Es muy sencillo y frecuente subir ficheros entre cliente y servidor
- Cuando vamos a subir ficheros hay que conocer acciones a indicar tanto en la parte de cliente como en la de servidor.
Acciones en el Cliente
- input type=file
- Debemos especificar un elemento input con de type file en un formulario
- Como todo input debe tener asignado un name para acceder a él en el servidor
<input type=file name=fichero>
- form method=POST enctype="multipart/form-data
- El formulario donde esté el input ha de tener especificado el atributo enctype establecido con el valor mutipart/form-data.
- Cuando no especificamos tipo, se asume por defecto el valor application/x-www-form-urlencoded. Este valor implica que enviamos texto plano y lo podremos enviar tanto por GET como por POST.
- No obstante si vamos a transferir un fichero no necesariamente de texto debemos especificarlo establemciendo el valor de enctype a mutipart/form-data. Este valor se emplea para tranferir gran cantidad de texto u otros formatos de fichero entre cliente y servidor
https://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#form-content-type |
enctype es un atributo necesario para especificar el tipo de contendio usado para enviar la información del formulario al servidor
- Necesariamente hemos de usar el método POST para este cometido
<form action='' method=POST entype='multipart/form-data'> .... </form>
- Establecer tamaño en el cliente
- El tamaño de bytes que vamos a enviar también puede quedar establecido en el cliente, de modo que si el fichero tiene un tamaña mayor, no se envía
- Para esto se establece antes del input file, un input hidden con name = MAX_SIZE_FILE y value el valor del tamaño máximo.
- Este mecanismo no avisa al cliente de nada, simplemente dejará de enviar el fichero al servidor en caso de exceder el tamaño.
- En el servidor se recibirá un error de valor 2 o constante UPLOAD_ERR_FORM_SIZE, (Ver código de errores más abajo o en http://php.net/manual/es/features.file-upload.errors.php
- Con todo lo dicho, la especificación en el cliente quedaría
<form action="descarga.php" method="POST" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="10000000"> <h3>Selecciona fichero </h3> <input type="file" name="fichero" id="" > <br /> <input type="submit" value="Acceder" name="descarga"> </form>
Acciones en el Servidor: $_FILES
- La forma de acceder al input del tipo file que viene del cliente en la solicitud al servidor es a través de la superglobal $_FILES
- Lo pirmero que deberemos hacer es acceder a este elemento con el nombre del input
$fichero = $_FILES['nombre_input_file']
- $_FILES es un array asociativo con tantos elementos con input de tipo file vengan del formulario cuyo submit ha generado una solicitud al servidor
- Cada posición a su vez contiene un array asociativo con información de ese fichero alamcenada en 5 componentes
- name Nombre del fichero en el cliente
- type Tupo de fichero subido
- size Tamaño en bytes del fichero
- tpm_name Nombre asignado de forma temporal en el servidor
- error Error que se haya podido producir o 0 si no ha habido ninguno (Ver tabla más abajo)
Con el fichero que viene del cliente, en el servidor podemos hacer:
- Capturar el fichero y dejarlo en un directorio concreto
- Ver si se ha producido algún error especificando el código de error mediante una constante numérica
- Ver el tamaño del fichero
- Analizar el tipo de fichero para poder por ejemplo aceptarlo o descartarlo o decidir en qué carpeta dejarlo en función del tipo
Copiando el fichero a una carpeta
- La primera acción será copiarnos el fichero en una ubucación concreta dentro de nuestro servidor
- Lógicamente primero deberemos crear esa carpeta y asegurarnos que tenga permisos de escritura en ella el usuario apache (normalmente www-data)
- En el servidor tenemos el fichero disponible de forma temporal en la capeta /tmp. Podemos acceder a esta información en el elemento $_FILES['tmp_name']
- Para copiarlo usaremos la función move_uploaded_file($origen, $destino);, dónde $origen es el fichero que queremos copiar con ubicación y $destino es la ubicación y nombre de fichero donde queremos dejarlo.
- Lo más habitual es dejar el fichero con el mismo nombre que tenía en el cliente, esta información la tenemos disponible en el atributo $_FILES['name']
- La función move_upload(..) retorna un booleano que indica el éxito o fracaso de la acción http://php.net/manual/es/function.move-uploaded-file.php.
- A continuación un resumen de estas acciones
//Suponemos en el cliente //... <input type=file name= fichero> // //Accedemos al fichero que está de forma temporal en el servidor $origen = $_FILES['fichero']['tmp_name']; /Accedemos al nombre del fichero con el que el cliente lo subió $nombreFichero = $_FILES['fichero']['name']; //Establecemos la ruta donde queremos dejar el fichero //En este caso en la carpeta del proyecto tenemos una carpeta llamada descargas con permiso de escritura para www-data $destino ="./descargas/".$nombreFichero //Ahora procedemos a copiar y ver el éxito o fracaso if (move_uploaded_file($origen, $destino)) echo ("El fichero $nombreFichero se ha subido correctamente"); else echo ("Error subiendo el fichero $nombreFichero");
Comprobando errores
- $_FILES[error] contiene información del error que se ha podido producir al subir el fichero
- La siguiente tabla es la lista de los posibles valores que va a haber en este elemento del array superglobal $_FILES
Valor entero | Constante | Descripción |
---|---|---|
0 | UPLOAD_ERR_OK | Fichero subido exitosamente1 |
1 | UPLOAD_ERR_INI_SIZE | Tamaño excedido según directiva upload_max_filesize de php.ini. |
2 | UPLOAD_ERR_FORM_SIZE | El fichero subido excede la directiva MAX_FILE_SIZE especificada en el formulario HTML. |
3 | UPLOAD_ERR_PARTIAL | El fichero fue sólo parcialmente subido. |
4 | UPLOAD_ERR_NO_FILE | No se subió ningún fichero. |
6 | UPLOAD_ERR_NO_TMP_DIR | Falta la carpeta temporal. |
7 | UPLOAD_ERR_CANT_WRITE | No se pudo escribir el fichero en el disco. |
8 | UPLOAD_ERR_EXTENSION | Una extensión de PHP detuvo la subida de ficheros. |
- Un posible código para obtener esta información
//Suponemos en el cliente //... <input type=file name= fichero> $fichero = $_FILES['fichero']; ..... $error = $fichero['error'] //Esto es igual que hacer $error = $_FILES['fichero']['error'] $error = $_FILES['error']; switch ($error){ case 0: echo "ERROR. Fichero subido de forma correcta. <br />"; break; case 1: echo "ERROR. Tamaño de fichero superior al establecido en el servidor <br />"; break; case 2: echo "ERROR. Tamaño de fichero superior al establecido en cliente<br />"; echo "El tamaño se estableción en el input MAX_FILE_SIZE<br/>"; echo "Tamaño establecido ".$_POST['MAX_FILE_SIZE']."<br/>"; break; case 3: echo "ERROR. EL fichero sólo se subió parcialmente <br/>"; break; case 4: echo "ERROR. No se subión ningún fichero <br/>"; break; case 6: echo "ERROR. No se encuentra la carpeta temporal <br/>"; break; case 7: echo "ERROR. No se pudo escribir en disco. revisa permisos <br/>"; break; case 8: echo "ERROR. Una extensión de php detuvo la subida del fichero <br/>"; break; default: echo "Valor de error desconocido"; }
- Ver el tamaño del fichero
- Analizar el tipo de fichero para poder por ejemplo aceptarlo o descartarlo o decidir en qué carpeta dejarlo en función del tipo
- Una vez presionado el submit en el cliente el fichero se copia en un fichero en una carpeta temporal
- Almacenando el fichero en el servidor
- Una vez que está subido en la carpeta temporal y después de hacer las comprobaciones que consideremos, debemos guardarlo en el servidor
- Para ello usaremos la función
$rtdo= move_uploaded_file($origen, $destino);
- Cómo leer ficheros de un directorio en el servidor
- Vamos a usar la clase Directory
- El tema de programación orientado a objetos lo veremos mas tarde, pero sabemos que para invocar a un método de un objeto se usa el operador de indierección ->
- Los métodos los vemos como funciones que son de una clase y los puede invocar un objeto. (Esta idea imprecisa de momento es suficiente.
- Es una clase que me permite trabajar con ficheros (los directorios son ficheros igualmente)
- Para inicializarlo podemos usar un alias de new Directory() llamada dir(...)
- En su invocación pasamos el directorio que queremos ver
$directorio = dir("/var/www/musica/subidas/");
- Para leer el contenido de un fichero o un directorio (los archivos que contiene), se usa el método read()
- Una forma de hacerlo es
while ($archivo = $directorio -> read()){ ................. } }
- No olvidemos cerrar el fichero con el método close
$directorio->close();
[[Actividad
Se pide que hagas un programa para subir ficheros de música a un servidor y qué este me visualice todos los ficheros subidos]]