• Publicidad

CGI para subir múltiples archivos

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

CGI para subir múltiples archivos

Notapor Alfumao » 2011-12-12 09:23 @433

Hola a todos,

Mi consulta es la siguiente:

¿Cómo puedo crear un CGI que me permita seleccionar múltiples archivos para hacer el "upload" o subida de estos de una sola vez?
Lo necesito porque quiero crear una utilidad web que una varios ficheros de texto en uno solo, y para ello necesito poder subir varios archivos de una sola vez (no está definido cuántos archivos serán los que se unirán cada vez que se utilice) y que así el CGI tenga acceso a ellos y los pueda juntar.

El código de subida que utilizaba hasta ahora es el que me explicó explorer tiempo atrás:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $targetname=param(target);
  2. my $lightweight_fh;
  3. my $io_handle;
  4. my $bytesread;
  5.  
  6.  
  7. $lightweight_fh  = upload('file');
  8.  
  9.        
  10.          if (defined $lightweight_fh) {
  11.            
  12.            $io_handle = $lightweight_fh->handle;
  13.             open (OUTFILE,'>>'."C:/xampp/htdocs/DB/Uploads/$targetname.txt");
  14.             binmode(OUTFILE);
  15.            
  16.            while ($bytesread = $io_handle->read(my $buffer,2048)) {
  17.              print OUTFILE $buffer;
  18.            }
  19.            close OUTFILE;
  20.            
  21.          }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿Sería útil en este caso o habrá que utilizar otra estrategia?

Gracias por adelantado
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Publicidad

Re: CGI para subir múltiples archivos

Notapor explorer » 2011-12-12 10:38 @484

Se puede utilizar la misma estrategia: en el manual de CGI, en el apartado PROCESSING A FILE UPLOAD FIELD se comenta que upload() se puede ejecutar en contexto lista para el mismo control de formulario de subida de archivos, por lo que devolverá una array de gestores de archivo.

Entonces, en el código HTML ponemos uno o más controles llamados de la misma manera (por ejemplo, 'file'), y luego en el código,

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @fh = upload('file');

for my $fh (@fh) {
    # ... resto del programa que lee desde $fh
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Bueno, esta es *una* manera de hacerlo, desde luego.

Se podría hacer también como en las web más elaboradas, donde un código JavaScript sea el que vaya subiendo esos ficheros, o modificando el formulario para crear más controles de subida, todo desde el lado del cliente.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: CGI para subir múltiples archivos

Notapor Alfumao » 2011-12-12 18:17 @803

Gracias, explorer, pero de esta manera, el número de archivos a subir estará limitado por el número de controles puestos en el HTML, ¿no?

Yo buscaba una forma para, por ejemplo, poder seleccionar varios archivos de una vez (en un solo formulario de subida) como se puede hacer en algunos servidores de correo electrónico... Aunque supongo que eso se hará con otros lenguajes de programación, como has expuesto y no con HTML y Perl...
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: CGI para subir múltiples archivos

Notapor explorer » 2011-12-12 21:42 @946

Perl está en el lado del servidor, no del cliente.

Según el estándar, se puede usar la marca <input> de tipo file para que el usuario mande uno o varios archivos. Al pulsar el botón de navegar, debe salir un control que permita al usuario elegir qué archivo(s) desea subir.

Lo he probado en mi casa y funciona, pero con el firefox y mi Linux, no me deja elegir más que solo un fichero cada vez. Pero creo que es por limitación de la caja de selección. Lo he probado con el navegador Konqueror y pasa lo mismo (es la misma caja de selección). En otros sitios pone que con Opera sí que se pueden elegir varios ficheros (usando la tecla Control para selección individual, o Shift/ratón para rangos de archivos).

No es un tema de HTML Y Perl. Perl está en el lado del servidor. En el lado del cliente se suele usar JavaScript para superar las barreras que impone el estándar HTML. Por ejemplo, se puede tener una caja de texto que admita varios nombres de archivos y luego sea un JavaScript el que, yendo de uno en uno, los vaya subiendo, y en ese momento, es donde aparece Perl, recibiendo la petición de subida de cada fichero.

En Gmail, por ejemplo, primero tienes que pulsar un enlace llamado "Adjuntar un archivo", que hace aparecer la primera caja de selección de archivo. Si se quiere que salgan más, pues hay que pulsar en otro enlace que dice "Adjuntar otro archivo". Y mientras estás eligiendo el segundo, está por detrás subiendo el primero. Todo eso se hace con JavaScript, independientemente del programa que está en el servidor (que no sabemos en qué lenguaje es, pero ahora no importa, ya que si fuera Perl, estaría recibiendo peticiones HTTP normales, de subida de un fichero cada vez).

Aquí hay algunos ejemplos para JQuery.

Como se comenta en este hilo (en inglés), el control actual de subida de archivos es muy primitivo, y por eso hay que hacer trucos con el JavaScript. O empezar a usar las facilidades de HTML 5, que sí soporta la selección de múltiples archivos. El problema es que no todos los navegadores actuales soportan HTML 5.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado