Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Web » Malformed multipart POST: data truncated Responder al tema
Nuevo tema


Página 1 de 1  [ 14 mensajes ] 
 
Nota 2009-09-03 15:52 @703

Perlero Nuevo
Registrado: 2009-08-06 15:13 @675
Mensajes: 26
Malformed multipart POST: data truncated
Hola muchachos, buenas tardes...
Tengo un pequeño problemita subiendo archivos al server, me tira el error:

Software error:

Malformed multipart POST: data truncated

For help, please send mail to this site's webmaster, giving this error message and the time and date of the error.


Creo que es porque no se forma bien el header, pero la verdad no sé bien cómo funciona el asunto.

Paso el código a ver si tienen alguna idea:
Syntax: [ Download ] [ Hide ]
Using html4strict Syntax Highlighting
  1.   <fieldset class="adj">
  2.      <legend><a class="titulo2">Archivos Adjuntos</a></legend>
  3.         <form action="sube_adj.pl" method="post" enctype="multipart/form-data">
  4.                 <input class="brow" type="file" onchange="adjunt(this)"/>
  5.                 <br /><br />
  6.                 <input type="submit" value="adjuntar archivo" />
  7.         </form>
  8.   </fieldset>
  9.  


Y el cgi es :
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use CGI::Carp qw(fatalsToBrowser);
  5. use CGI;
  6.  
  7. my %Input;
  8.  
  9. my $query = new CGI;
  10. my @pairs = $query->param;
  11.  
  12. foreach my $pair(@pairs)
  13.         {
  14.         $Input{$pair} = $query->param($pair);
  15.         }
  16.  
  17. #Directorio donde queremos estacionar los archivos
  18. my $dir = "/adjuntos";
  19.  
  20. #Array con extensiones de archivos que podemos recibir
  21. my @extensiones = ('gif','jpg','jpeg','bmp','png');
  22.  
  23. &recepcion_de_archivo(); #Iniciar la recepcion del archivo
  24.  
  25. #TODO SALIO BIEN
  26. print "Content-type: text/html\n\n";
  27. print "<h1>El archivo fue recibido correctamente</h1>\n";
  28.  
  29. exit(1);
  30.  
  31. sub recepcion_de_archivo {
  32.     my $nombre_en_servidor = $Input{'archivo'};
  33.     $nombre_en_servidor =~ s/ /_/gi;
  34.     $nombre_en_servidor =~ s!^.*(\\|\/)!!;
  35.  
  36.     my $extension_correcta = 0;
  37.  
  38.     foreach (@extensiones) {
  39.         if ($nombre_en_servidor =~ /\.$_$/i) {
  40.             $extension_correcta = 1;
  41.             last;
  42.         }
  43.     }
  44.  
  45.     if ($extension_correcta) {
  46.         #Abrimos el nuevo archivo
  47.         open (OUTFILE, ">$dir/$nombre_en_servidor") || die "No se puedo crear el archivo";
  48.         binmode(OUTFILE); #Para no tener problemas en Windows
  49.  
  50.         #Transferimos byte por byte el archivo
  51.         while (my $bytesread = read($Input{'archivo'}, my $buffer, 1024)) {
  52.             print OUTFILE $buffer;
  53.         }
  54.  
  55.         #Cerramos el archivo creado
  56.         close (OUTFILE);
  57.     }
  58.     else {
  59.         print "Content-type: text/html\n\n";
  60.         print "<h1>Extension incorrecta</h1>";
  61.         print "Sólo se reciben archivo con extension:";
  62.         print join(",", @extensiones);
  63.         exit(0);
  64.     }
  65.  
  66. } #sub recepcion_de_archivo


Bueno, gracias de antemano por estar ahí y darnos una mano a los que recién arrancamos con Perl-CGI.

PD: Espero que el código no tenga copyright :lol:


Última edición por explorer el 2009-09-03 16:13 @717, editado 1 vez en total
Acentos y formateo de código


Nota 2009-09-03 16:33 @731
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10261
Re: Malformed multipart POST: data truncated
¡Ánimo con el CGI!

Ya verás, cuando sepas algo más, que puedes reducir mucho el código que has puesto, gracias a las funciones que da CGI. Y cuando descubras HTML::Template, ¡vamos!.

El mensaje de error sale cuando el módulo CGI se encuentra conque el descriptor de fichero conectado al fichero que estamos recibiendo, marca un fin de fichero:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
die "Malformed multipart POST: data truncated\n" if $self->eof;


Por el código, no veo dónde puede estar el error, pero el mensaje es tan difuso, que podría ocurrir incluso porque el fichero no ha sido transmitido.

En el manual de CGI, en la parte de subida de ficheros, se recomienda el uso de la función upload():
(no probado)
Syntax: [ Download ] [ Hide ]
  1. <input type="file" id="file" name="file"> 


Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
my $fh = upload('file');
while (my $buffer = <$fh>) {
    print OUT $buffer;
}

Fíjate, que, a diferencia de tu código, sí que le puesto un 'name' al campo 'file', para poder luego hacer referencia a él en la función upload().

Prueba lo mismo: dale un 'name' al campo, a ver qué pasa.

_________________
JF^D Perl programming


Nota 2009-09-03 17:18 @762

Perlero Nuevo
Registrado: 2009-08-06 15:13 @675
Mensajes: 26
Re: Malformed multipart POST: data truncated
Lo intentaré. Gracias por la rapidez de la respuesta, espero algún día poder pagarte las cervezas que te debo ya... :lol:


Nota 2009-09-03 17:26 @768

Perlero Nuevo
Registrado: 2009-08-06 15:13 @675
Mensajes: 26
Re: Malformed multipart POST: data truncated
Perdón por la insistencia, pero ¿dónde lo subiría al archivo?
¿O cómo hago para indicarle a dónde subirlo?

Algo así como:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
my $fh = upload(adjuntos/'file');
while (my $buffer = <$fh>) {
    print OUT $buffer;
}


Bueno nuevamente gracias y andá contando las birras...


Nota 2009-09-03 18:22 @806
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10261
Re: Malformed multipart POST: data truncated
No, no lo has entendido.

La función upload() nos da el descriptor del fichero que el usuario está subiendo, y que usaremos para leerlo y copiarlo al destino.

Antes, tienes que haber abierto ese fichero destino, como tienes en el código que has mostrado el principio.

El parámetro que se le pasa al upload() es el nombre del campo <input> HTML de tipo file donde el usuario indica el fichero a subir.

En tu ejemplo, tienes esto:
Syntax: [ Download ] [ Hide ]
Using html4strict Syntax Highlighting
<input class="brow" type="file" onchange="adjunt(this)"/>

pero aquí no le has indicado ningún nombre o id. Lo ideal es que tenga uno. Así:
Syntax: [ Download ] [ Hide ]
Using html4strict Syntax Highlighting
<input class="brow" type="file" name="fichero" onchange="adjunt(this)"/>

Ahora ya puedes usar
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
upload('fichero')

para conectar con el fichero que se sube.

_________________
JF^D Perl programming


Nota 2009-09-04 13:14 @593

Perlero Nuevo
Registrado: 2009-08-06 15:13 @675
Mensajes: 26
Re: Malformed multipart POST: data truncated
Ok, a ver si entiendo...

Lo que llamas descriptor es un puntero al archivo, ¿no?

Y lo que tengo que hacer es reemplazar la parte del código que me está pasando el archivo al cgi, ¿no? o sea:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. my %Input;
  2. my $query = new CGI;
  3. my @pairs = $query->param;
  4. foreach my $pair(@pairs)
  5.         {
  6.         $Input{$pair} = $query->param($pair);
  7.         }


Por esta otra:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. my $fh = upload('file');
  2. while (my $buffer = <$fh>) {
  3.     print OUT $buffer;
  4. }

Y luego hacer que se escriba la salida del archivo ya abierto que en es este caso estaría en esta parte del código:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1.     if ($extension_correcta) {
  2.         #Abrimos el nuevo archivo
  3.         open (OUTFILE, ">$dir/$nombre_en_servidor") || die "No se puedo crear el archivo";
  4.         binmode(OUTFILE); #Para no tener problemas en Windows
  5.         #Transferimos byte por byte el archivo
  6.         while (my $bytesread = read($Input{'archivo'}, my $buffer, 1024)) {
  7.             print OUTFILE $buffer;
  8.         }


Bueno gracias por tu tiempo y perdón por mi cabeza dura...


Nota 2009-09-04 13:50 @618
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10261
Re: Malformed multipart POST: data truncated
Pues no... tampoco atinas en esta ocasión... :)
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
my $fh = upload('archivo');
while (my $buffer = <$fh>) {
    print OUT $buffer;
}

sustituye a
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
while (my $bytesread = read($Input{'archivo'}, my $buffer, 1024)) {
    print OUTFILE $buffer;
}


Fíjate que está haciendo un bucle para leer de un fichero y escribir en otro.

_________________
JF^D Perl programming


Última edición por explorer el 2009-09-04 14:16 @636, editado 1 vez en total
file => archivo


Nota 2009-09-04 14:18 @638

Perlero Nuevo
Registrado: 2009-08-06 15:13 @675
Mensajes: 26
Re: Malformed multipart POST: data truncated
Jajaja. Si es que la puntería falla los viernes :lol:

Mirá eso que me dijiste lo deduje luego de postearlo (mal por mi) que no edité...

Pero mira, te pego el código y me tira el error aunque subo un jpg:
Extension incorrecta
Sólo se reciben archivo con extensión: gif, jpg, jpeg, bmp, png


Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use CGI::Carp qw(fatalsToBrowser);
  5. use CGI;
  6.  
  7. my %Input;
  8. my $query = new CGI;
  9. my @pairs = $query->param;
  10. foreach my $pair(@pairs)
  11.         {
  12.         $Input{$pair} = $query->param($pair);
  13.         }
  14.        
  15. #Directorio donde queremos estacionar los archivos
  16. my $dir = "/adjuntos";
  17.  
  18. #Array con extensiones de archivos que podemos recibir
  19. my @extensiones = ('gif','jpg','jpeg','bmp','png');
  20.  
  21. &recepcion_de_archivo(); #Iniciar la recepcion del archivo
  22.  
  23. #TODO SALIO BIEN
  24. print "Content-type: text/html\n\n";
  25. print "<h1>El archivo fue recibido correctamente</h1>\n";
  26. exit(1);
  27.  
  28. sub recepcion_de_archivo
  29. {
  30. my $nombre_en_servidor = $Input{'archivo'};
  31. $nombre_en_servidor =~ s/ /_/gi;
  32. $nombre_en_servidor =~ s!^.*(\\|\/)!!;
  33. my $extension_correcta = 0;
  34. foreach (@extensiones)
  35.         {
  36.         if ($nombre_en_servidor =~ /\.$_$/i)
  37.                 {
  38.                 $extension_correcta = 1;
  39.                 last;
  40.                 }
  41.         }
  42.         if ($extension_correcta)
  43.                 {
  44.                 my $fh = upload('file');
  45.  
  46.                 open (OUTFILE, ">$dir/$nombre_en_servidor") || die "No se puedo crear el archivo";
  47.                 binmode(OUTFILE); #Para no tener problemas en Windows
  48.                 while (my $buffer = <$fh>)
  49.                         {
  50.                         print OUT $buffer;
  51.                         }
  52.                 #Cerramos el archivo creado
  53.                 close (OUTFILE);
  54.                 }else {
  55.                                 print "Content-type: text/html\n\n";
  56.                                 print "<h1>Extension incorrecta</h1>";
  57.                                 print "S&oacute;lo se reciben archivo con extensi&oacute;n: ";
  58.  
  59.                                 print join(", ", @extensiones);
  60.                                 exit(0);
  61.                                 }
  62. }#sub recepcion_de_archivo

Pero es cuestión de depurarlo... Así que mil gracias, por lo menos sé que me pasa el archivo al cgi y que debería subirlo.
Te mando un abrazo y gracias por todo.


Nota 2009-09-04 14:23 @641
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10261
Re: Malformed multipart POST: data truncated
En el código HTML, ¿cómo se llama el campo que almacena el nombre del fichero? ¿'file' o 'archivo'?

Según el código que pones en el primer mensaje, es 'file', pero en el código que pones ahora, es 'archivo':
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
$Input{'archivo'}

_________________
JF^D Perl programming


Nota 2009-09-04 14:39 @652

Perlero Nuevo
Registrado: 2009-08-06 15:13 @675
Mensajes: 26
Re: Malformed multipart POST: data truncated
Tío, qué paciencia que me tenés...

En realidad se llama 'file'; si lo pongo así me tira este error:

Software error:

Undefined subroutine &main::upload called at C:\http\new\0-0\nuevositio\prototipo\sube_adj_t.pl line 44.

For help, please send mail to this site's webmaster, giving this error message and the time and date of the error.


Así que me gustó mas que me tire un error del script... :lol: y lo cambié.

Pero me imagino que será que no me toma la función upload()... Es que tengo problemas con los módulos, los admin de acá dejan mucho que desear... y todavía no doy pie con bola con lo de las librerías en el @INC. Pero luego trabajaré en esto.


Nota 2009-09-04 15:56 @705
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10261
Re: Malformed multipart POST: data truncated
El error dice que Perl no tiene ni idea de dónde está la función upload(). Hay que decirle que está en el módulo CGI.

Cambia
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
use CGI;

por
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
use CGI ':cgi';


La etiqueta ':cgi' hace importar un montón de funciones y variables relacionadas con operaciones de CGI a nuestro programa. Una de ellas es la función upload().

Aprender a usar el módulo CGI es muy importante, y solo hay dos formas de hacerlo: leyendo mucho código y leyendo su manual de instrucciones.

Sí, ya sé que es un auténtico ladrillo, pero los beneficios son muchos. Entre ellos, dejar tu programa así.

Con una página HTML así:
Syntax: [ Download ] [ Hide ]
Using html4strict Syntax Highlighting
  1. <html>
  2. <body>
  3. <form method="POST" enctype="multipart/form-data" action="cgi-bin/code_18877.pl">
  4. <input type="file" name="file" size="50"> <input type="submit" value="Enviar" />
  5. </form>
  6. </body>
  7. </html>

queda el programa así (una de las muchas formas de hacerlo):
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use CGI       ':standard';
  7. use CGI::Carp 'fatalsToBrowser';
  8.  
  9.  
  10. ## Constantes
  11. my @extensiones = qw( gif jpg jpeg bmp png txt );               # Arreglo con extensiones de archivos que podemos recibir
  12. my $dir = '/home/explorer.joaquinferrero.com/public_html/tmp';  # Directorio donde queremos estacionar los archivos
  13.  
  14.  
  15. ## Variables
  16. my $fichero_a_recibir = param('file') || '';
  17.  
  18.  
  19. ## Proceso
  20. foreach my $extension (@extensiones) {
  21.  
  22.     if ($fichero_a_recibir =~ /\.$extension/) {
  23.  
  24.         my $fh = upload('file');
  25.  
  26.         if (!$fh && cgi_error) {                                # Ocurrió un error o el usuario abortó el envío
  27.             print header(-status => cgi_error);
  28.             exit 0;
  29.         }
  30.  
  31.         my $fichero_a_grabar = "$dir/$fichero_a_recibir";
  32.  
  33.         open OUT, ">$fichero_a_grabar" or die "ERROR: No puedo escribir $fichero_a_grabar: $!\n";
  34.  
  35.         while (read($fh, my $buffer, 1024)) {
  36.             print OUT $buffer;                                  # Copia
  37.         }
  38.  
  39.         close OUT;
  40.  
  41.         print header                                            # Gracias
  42.             , start_html('Gracias por el envío')
  43.             , p("Gracias por el envío de $fichero_a_recibir")
  44.             , end_html
  45.             ;
  46.  
  47.         exit;
  48.     }
  49. }
  50.  
  51. print header                                                    # Oops... algo fue mal
  52.     , start_html('ERROR')
  53.     , h1('Extensión incorrecta')
  54.     , p("Sólo se reciben archivos con extensiones: @extensiones")
  55.     , p("Archivo: [$fichero_a_recibir]")
  56.     , end_html
  57.     ;
  58.  
  59. __END__

_________________
JF^D Perl programming


Última edición por explorer el 2009-09-04 16:14 @718, editado 2 veces en total
ascii-art


Nota 2009-09-04 16:39 @735

Perlero Nuevo
Registrado: 2009-08-06 15:13 @675
Mensajes: 26
Re: Malformed multipart POST: data truncated
Jajaja, perdiste la paciencia :lol:

Perdón pero la idea era hacerlo yo. Igualmente me salvó que me dijeras que la función upload() está en CGI ':cgi'; porque no lo sabía. La documentación la leí pero bueno, el inglés no es lo mío, como se habrá notado.

La cosa es que funciona el script que había hecho, pero no tengo permisos para escribir en el servidor (CHAN!) :shock:

Jajaja, era eso. Bueno, para la próxima te prometo no ser tan gomoso... :mrgreen:

Te mando un abrazo y mil gracias por la ayuda. Juro que no posteo en una semana (aunque no lo puedo asegurar) jajaja :lol:

PD: ¡Buen fin de semana!


Última edición por explorer el 2009-09-04 16:51 @744, editado 1 vez en total
Ortografía


Nota 2009-09-04 16:49 @742
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10261
Re: Malformed multipart POST: data truncated
Tienes que ocuparte en dar permisos de escritura al directorio donde vas a guardar los ficheros.

Con un chmod 777 carpeta ya estás dando permisos para escritura a todos. Ten en cuenta que quien realiza la escritura es el usuario que ejecuta el servidor web.

_________________
JF^D Perl programming


Nota 2009-09-07 21:35 @941

Perlero Nuevo
Registrado: 2009-08-06 15:13 @675
Mensajes: 26
Re: Malformed multipart POST: data truncated
Si es lo que quise hacer... Pero no te olvides que el server no lo administro yo, son los panchos que les encantan las ventanitas... :lol:

Y bueno, debe tener permiso de escritura sobre las carpetas el user guest.

Pero es así la vida... :cry:

Por lo demás, mil gracias.


Responder al tema  [ 14 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO