Diferencia entre revisiones de «Plantilla:PHP/Formularios/transmisionFicheros»
Línea 4: | Línea 4: | ||
*Cuando vamos a subir ficheros hay que conocer acciones a indicar tanto en la parte de cliente como en la de 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==== | ====Acciones en el Cliente==== | ||
+ | ;input type=file | ||
*Debemos especificar un elemento '''''input''''' con de '''type''' '''''file''''' en un formulario | *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 | *Como todo input debe tener asignado un '''name''' para acceder a él en el servidor | ||
Línea 9: | Línea 10: | ||
<input type=file name=fichero> | <input type=file name=fichero> | ||
</source> | </source> | ||
− | *El formulario | + | ;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. | *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''' | + | *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 |
+ | {{MRM_Referencias en la Web| | ||
https://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#form-content-type | 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 | '''''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 | |
− | + | <source lang=html35> | |
− | + | <form action='' method=POST entype='multipart/form-data'> | |
− | + | .... | |
− | + | </form> | |
− | <source lang= | + | |
− | + | ||
</source> | </source> | ||
− | * | + | ;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 | |
+ | *Con todo lo dicho, la especificación en el cliente quedaría | ||
+ | <source lang=html5> | ||
+ | <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> | ||
+ | </source> | ||
+ | ====Acciones en el Servidor: $_FILES==== | ||
+ | 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 y una pequeña descrición | ||
+ | #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 | ||
+ | *Lógicamente primero deberemos crear esa carpeta y asegurarnos que tenga permisos de escritura en ella el usuario apache (normalmente www-data) | ||
+ | *Cuando viene la solicitud del cliente con un fichero como contenido de un formulario, se accede a ese input a través de la superglobal '''''$_FILES'''''. | ||
+ | *$_FILES va a ser un array asociativo con un elemento por cada input de tipo file que venga del servidor, o sea por cada fichero subido | ||
*Cada posición a su vez contiene un array asociativo con información de ese fichero donde entre otros tenemos los siguientes campos que nos interesan | *Cada posición a su vez contiene un array asociativo con información de ese fichero donde entre otros tenemos los siguientes campos que nos interesan | ||
# '''''name''''' Nombre del fichero en el cliente | # '''''name''''' Nombre del fichero en el cliente | ||
Línea 31: | Línea 53: | ||
# '''''size''''' Tamaño en bytes del fichero | # '''''size''''' Tamaño en bytes del fichero | ||
# '''''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 | ||
*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 | ||
;Almacenando el fichero en el servidor | ;Almacenando el fichero en el servidor |
Revisión de 04:09 30 oct 2016
=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
Plantilla:MRM Referencias en la Web 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
Idioma no válido.
Necesita especificar un idioma como esto: <source lang="html4strict">...</source>
lenguajes soportados para sintaxis remarcada:
4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, apt_sources, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_loadrunner, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, cpp-qt, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, ocaml-brief, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, php-brief, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xorg_conf, xpp, yaml, z80, zxbasic
<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
- 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
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 y una pequeña descrición
- 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
- Lógicamente primero deberemos crear esa carpeta y asegurarnos que tenga permisos de escritura en ella el usuario apache (normalmente www-data)
- Cuando viene la solicitud del cliente con un fichero como contenido de un formulario, se accede a ese input a través de la superglobal $_FILES.
- $_FILES va a ser un array asociativo con un elemento por cada input de tipo file que venga del servidor, o sea por cada fichero subido
- Cada posición a su vez contiene un array asociativo con información de ese fichero donde entre otros tenemos los siguientes campos que nos interesan
- 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
- 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]]