• Publicidad

Malformed multipart POST: data truncated

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

Malformed multipart POST: data truncated

Notapor makhix » 2009-09-03 15:52 @703

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:
Sintáxis: [ Descargar ] [ Ocultar ]
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.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Y el cgi es :
Sintáxis: [ Descargar ] [ Ocultar ]
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
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


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
Razón: Acentos y formateo de código
makhix
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2009-08-06 15:13 @675

Publicidad

Re: Malformed multipart POST: data truncated

Notapor explorer » 2009-09-03 16:33 @731

¡Á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:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
die "Malformed multipart POST: data truncated\n" if $self->eof;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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)
Sintáxis: [ Descargar ] [ Ocultar ]
  1. <input type="file" id="file" name="file"> 


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $fh = upload('file');
while (my $buffer = <$fh>) {
    print OUT $buffer;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

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 & 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: Malformed multipart POST: data truncated

Notapor makhix » 2009-09-03 17:18 @762

Lo intentaré. Gracias por la rapidez de la respuesta, espero algún día poder pagarte las cervezas que te debo ya... :lol:
makhix
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2009-08-06 15:13 @675

Re: Malformed multipart POST: data truncated

Notapor makhix » 2009-09-03 17:26 @768

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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $fh = upload(adjuntos/'file');
while (my $buffer = <$fh>) {
    print OUT $buffer;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Bueno nuevamente gracias y andá contando las birras...
makhix
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2009-08-06 15:13 @675

Re: Malformed multipart POST: data truncated

Notapor explorer » 2009-09-03 18:22 @806

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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
<input class="brow" type="file" onchange="adjunt(this)"/>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

pero aquí no le has indicado ningún nombre o id. Lo ideal es que tenga uno. Así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
<input class="brow" type="file" name="fichero" onchange="adjunt(this)"/>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Ahora ya puedes usar
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
upload('fichero')
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

para conectar con el fichero que se sube.
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: Malformed multipart POST: data truncated

Notapor makhix » 2009-09-04 13:14 @593

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:

Sintáxis: [ Descargar ] [ Ocultar ]
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.         }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Por esta otra:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $fh = upload('file');
  2. while (my $buffer = <$fh>) {
  3.     print OUT $buffer;
  4. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.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:
Sintáxis: [ Descargar ] [ Ocultar ]
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.         }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Bueno gracias por tu tiempo y perdón por mi cabeza dura...
makhix
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2009-08-06 15:13 @675

Re: Malformed multipart POST: data truncated

Notapor explorer » 2009-09-04 13:50 @618

Pues no... tampoco atinas en esta ocasión... :)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $fh = upload('archivo');
while (my $buffer = <$fh>) {
    print OUT $buffer;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

sustituye a
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while (my $bytesread = read($Input{'archivo'}, my $buffer, 1024)) {
    print OUTFILE $buffer;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Fíjate que está haciendo un bucle para leer de un fichero y escribir en otro.
Última edición por explorer el 2009-09-04 14:16 @636, editado 1 vez en total
Razón: file => archivo
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: Malformed multipart POST: data truncated

Notapor makhix » 2009-09-04 14:18 @638

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


Sintáxis: [ Descargar ] [ Ocultar ]
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
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

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.
makhix
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2009-08-06 15:13 @675

Re: Malformed multipart POST: data truncated

Notapor explorer » 2009-09-04 14:23 @641

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':
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$Input{'archivo'}
Coloreado en 0.001 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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Malformed multipart POST: data truncated

Notapor makhix » 2009-09-04 14:39 @652

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.
makhix
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2009-08-06 15:13 @675

Siguiente

Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron