• Publicidad

Upload con CGI en pequeñas partes

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

Upload con CGI en pequeñas partes

Notapor timh » 2009-03-17 16:24 @725

Bueno, pues primeramente me presento: me llamo Jacob Nuñez, y me estoy tratando de meter en este gran mundo de la programación en Perl.

Ya hace varios años que he tratado de desarrollar un script CGI en Perl que pueda subir archivos grandes en pequeñas partes, a lo mejor esto ya lo han visto por ejemplo en RapidShare o MegaUpload; los scripts que tienen (el de RapidShare está en hecho en Perl), al subir un archivo, como que lo van subiendo en pequeñas partes y así no importa que sea un archivo de 100Mb lo sube y no hay problemas.

Eso es más o menos lo que quiero tratar de hacer: subir un archivo grande en pequeñas partes. Ojalá me puedan echar una mano.

Saludos.
timh
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2009-03-17 16:02 @710

Publicidad

Notapor explorer » 2009-03-17 19:48 @867

Bienvenido a los foros de Perl en Español, timh.

No sabía la relación entre Perl y RapidShare. He buscado en Google por ese par de palabras y salen un montón de enlaces. Muchos se refieren a los propios ficheros alojados en RapidShare, pero también aparecen enlaces a algo más interesante.

Por ejemplo, un enlace en CPAN al módulo Win32::IEAutomation::RapidShare para descargar ficheros.

También aparece un script de la propia empresa para hacer lo que tu dices, subir poco a poco el fichero, pero he revisado el código y no parte el fichero en partes, si no que lo sube entero.

Lo he mirado un poco, y parece que se puede modernizar fácilmente. He incluso incorporar lo de partir en trozos, pero desconozco cómo interactuar con RapidShare para hacerlo de esa manera.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor timh » 2009-03-17 21:04 @919

Bueno, gracias por la respuesta pero la idea no es interactuar con RapidShare, sino yo en mi propio servidor subir los archivos por partecitas pequeñas. El script de RapidShare era solo un ejemplo de cómo quería hacerlo.

Básicamente esta inquietud me surge que al querer subir archivos grandes a un servidor por método convencional éste falla, ya sea debido al tiempo de ejecución del script o max_time_execution, o al tamaño restringido para subir archivos que tienen los servidores, pero si estos archivos se pudieran subir en pequeñas partes esto no sería problema. Más o menos tengo una idea pero no sé bien cómo implementarla en un script de Perl.

La idea es la siguiente:
  1. Mediante un formulario seleccionar el archivo que se desea subir.
  2. Leer solo un pequeño buffer de él, por ejemplo, de 1Kb, guardar ese archivo en el servidor y guardar la dirección de la parte del archivo donde finalizó la lectura, es decir donde se quedó.
  3. Después hacer otra petición de lectura pero comenzando en la dirección donde finalizó la anterior lectura, leer otro kylobyte y volver a escribirlo en el servidor pero ahora comenzando en la dirección donde se había quedado.

Bueno, no sé si está muy clara mi idea pero más o menos creo que ése sería el proceso. No sé qué opinan de esto.

Saludos.
timh
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2009-03-17 16:02 @710

Notapor explorer » 2009-03-18 04:54 @246

Entiendo lo que quieres hacer.

Entonces se trata de dos procesos.

Desde el lado del cliente, tu, con un programa, debes ser capaz de partir el fichero en partes, porque el navegador por sí solo no lo va a hacer. No creo que con JavaScript se pueda hacer, ni con otro complemento del navegador, porque las medidas de seguridad tan fuertes que tienen impiden todo acceso a la escritura en el sistema de ficheros local.

Desde el lado del servidor, se trataría de ir recibiendo los trozos e irles pegando, como tu indicas.

Quedaría por ver cómo indicar al servidor qué parte se ha transmitido. Se podría hacer igual que con el mismo método que usan otros programas similares (en UNIX/Linux existe el comando split). Se podría indicar en el propio nombre del trozo enviado, por ejemplo, al final del nombre, poner '_#743658', que indicaría, por ejemplo, que ese trozo corresponde a la parte que empieza en el byte indicado por el número. La longitud será la del trozo enviado.

Desde Perl, sería muy sencillo hacerlo, porque lo recibimos como un upload más, y también sabemos su nombre, y de ahí hacemos un seek() para posicionar el puntero de escritura, y allí es donde lo guardamos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2009-03-18 07:13 @342

Esta sería la primera parte:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
#
# Divide un fichero en partes de un tamaño máximo.
#
# Las partes se nombran igual que el fichero original, con el añadido de
#
#      _#offset
#
# siendo offset el desplazamiento en bytes dentro del fichero de esa parte.
#
# Joaquín Ferrero, marzo 2009.
#

use strict;
use warnings;

use utf8;


## Leer las opciones pasadas por el usuario
@ARGV == 2 or die "Uso: $0 <fichero a partir> <tamaño de cada parte>\n";

my ($el_fichero_a_partir, $este_tamaño) = @ARGV;

die "No encuentro $el_fichero_a_partir: $!\n"           if ! -e $el_fichero_a_partir;
die "Necesito un tamaño de parte mayor que cero.\n"     if $este_tamaño <= 0;
die "El tamaño del fichero es menor que las partes.\n"  if -s $el_fichero_a_partir < $este_tamaño;

print "Partiendo $el_fichero_a_partir en trozos de $este_tamaño bytes:\n";


## Abrir el fichero en lectura
open    FICHERO, q{<}, $el_fichero_a_partir   or die "No puedo abrir $el_fichero_a_partir: $!\n";
binmode FICHERO;


## Bucle
while ( tell FICHERO < -s $el_fichero_a_partir ) {

    ## Abrimos en escritura
    my $parte = "${el_fichero_a_partir}_#" . tell FICHERO;
    print "$parte\n";

    open    PARTE, q{>}, $parte               or die "No puedo abrir $parte: $!\n";
    binmode PARTE;


    ## Leemos un trozo y lo escribimos
    read    FICHERO, my $buffer, $este_tamaño or die "No puedo leer de $el_fichero_a_partir: $!\n";
    print   PARTE $buffer                     or die "No puedo escribir en $parte: $!\n";


    close   PARTE                             or die "No puedo cerrar $parte: $!\n";
}

close   FICHERO;

__END__
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
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

cron