2009-09-03 15:52 @703 |
|
|
makhix
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: Using html4strict Syntax Highlighting <fieldset class="adj">
<legend><a class="titulo2">Archivos Adjuntos</a></legend>
<form action="sube_adj.pl" method="post" enctype="multipart/form-data">
<input class="brow" type="file" onchange="adjunt(this)"/>
<br /><br />
<input type="submit" value="adjuntar archivo" />
</form>
</fieldset>
Y el cgi es : Using perl Syntax Highlighting #!/usr/bin/perl -w
use strict;
use CGI::Carp qw(fatalsToBrowser);
use CGI;
my %Input;
my $query = new CGI;
my @pairs = $query->param;
foreach my $pair(@pairs)
{
$Input{$pair} = $query->param($pair);
}
#Directorio donde queremos estacionar los archivos
my $dir = "/adjuntos";
#Array con extensiones de archivos que podemos recibir
my @extensiones = ('gif','jpg','jpeg','bmp','png');
&recepcion_de_archivo(); #Iniciar la recepcion del archivo
#TODO SALIO BIEN
print "Content-type: text/html\n\n";
print "<h1>El archivo fue recibido correctamente</h1>\n";
exit(1);
sub recepcion_de_archivo {
my $nombre_en_servidor = $Input{'archivo'};
$nombre_en_servidor =~ s/ /_/gi;
$nombre_en_servidor =~ s!^.*(\\|\/)!!;
my $extension_correcta = 0;
foreach (@extensiones) {
if ($nombre_en_servidor =~ /\.$_$/i) {
$extension_correcta = 1;
last;
}
}
if ($extension_correcta) {
#Abrimos el nuevo archivo
open (OUTFILE, ">$dir/$nombre_en_servidor") || die "No se puedo crear el archivo";
binmode(OUTFILE); #Para no tener problemas en Windows
#Transferimos byte por byte el archivo
while (my $bytesread = read($Input{'archivo'}, my $buffer, 1024)) {
print OUTFILE $buffer;
}
#Cerramos el archivo creado
close (OUTFILE);
}
else {
print "Content-type: text/html\n\n";
print "<h1>Extension incorrecta</h1>";
print "Sólo se reciben archivo con extension:";
print join(",", @extensiones);
exit(0);
}
} #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 
| Última edición por explorer el 2009-09-03 16:13 @717, editado 1 vez en total |
| Acentos y formateo de código |
|
2009-09-03 16:33 @731 |
|
|
 |
explorer
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: 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) - <input type="file" id="file" name="file">
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
|
2009-09-03 17:26 @768 |
|
|
makhix
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: Using perl Syntax Highlighting my $fh = upload(adjuntos/'file');
while (my $buffer = <$fh>) {
print OUT $buffer;
} Bueno nuevamente gracias y andá contando las birras...
|
2009-09-03 18:22 @806 |
|
|
 |
explorer
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: 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í: Using html4strict Syntax Highlighting <input class="brow" type="file" name="fichero" onchange="adjunt(this)"/> Ahora ya puedes usar Using perl Syntax Highlighting para conectar con el fichero que se sube.
_________________ JF^D Perl programming
|
2009-09-04 13:14 @593 |
|
|
makhix
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: Using perl Syntax Highlighting my %Input;
my $query = new CGI;
my @pairs = $query->param;
foreach my $pair(@pairs)
{
$Input{$pair} = $query->param($pair);
}
Por esta otra: Using perl Syntax Highlighting my $fh = upload('file');
while (my $buffer = <$fh>) {
print OUT $buffer;
}
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: Using perl Syntax Highlighting if ($extension_correcta) {
#Abrimos el nuevo archivo
open (OUTFILE, ">$dir/$nombre_en_servidor") || die "No se puedo crear el archivo";
binmode(OUTFILE); #Para no tener problemas en Windows
#Transferimos byte por byte el archivo
while (my $bytesread = read($Input{'archivo'}, my $buffer, 1024)) {
print OUTFILE $buffer;
}
Bueno gracias por tu tiempo y perdón por mi cabeza dura...
|
2009-09-04 13:50 @618 |
|
|
 |
explorer
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...  Using perl Syntax Highlighting my $fh = upload('archivo');
while (my $buffer = <$fh>) {
print OUT $buffer;
} sustituye a 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 |
|
2009-09-04 14:18 @638 |
|
|
makhix
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 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, pngUsing perl Syntax Highlighting #!/usr/bin/perl -w
use strict;
use CGI::Carp qw(fatalsToBrowser);
use CGI;
my %Input;
my $query = new CGI;
my @pairs = $query->param;
foreach my $pair(@pairs)
{
$Input{$pair} = $query->param($pair);
}
#Directorio donde queremos estacionar los archivos
my $dir = "/adjuntos";
#Array con extensiones de archivos que podemos recibir
my @extensiones = ('gif','jpg','jpeg','bmp','png');
&recepcion_de_archivo(); #Iniciar la recepcion del archivo
#TODO SALIO BIEN
print "Content-type: text/html\n\n";
print "<h1>El archivo fue recibido correctamente</h1>\n";
exit(1);
sub recepcion_de_archivo
{
my $nombre_en_servidor = $Input{'archivo'};
$nombre_en_servidor =~ s/ /_/gi;
$nombre_en_servidor =~ s!^.*(\\|\/)!!;
my $extension_correcta = 0;
foreach (@extensiones)
{
if ($nombre_en_servidor =~ /\.$_$/i)
{
$extension_correcta = 1;
last;
}
}
if ($extension_correcta)
{
my $fh = upload('file');
open (OUTFILE, ">$dir/$nombre_en_servidor") || die "No se puedo crear el archivo";
binmode(OUTFILE); #Para no tener problemas en Windows
while (my $buffer = <$fh>)
{
print OUT $buffer;
}
#Cerramos el archivo creado
close (OUTFILE);
}else {
print "Content-type: text/html\n\n";
print "<h1>Extension incorrecta</h1>";
print "Sólo se reciben archivo con extensión: ";
print join(", ", @extensiones);
exit(0);
}
}#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.
|
2009-09-04 14:23 @641 |
|
|
 |
explorer
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': Using perl Syntax Highlighting
_________________ JF^D Perl programming
|
2009-09-04 14:39 @652 |
|
|
makhix
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...  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.
|
2009-09-04 15:56 @705 |
|
|
 |
explorer
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 Using perl Syntax Highlighting por Using perl Syntax Highlighting 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í: Using html4strict Syntax Highlighting <html>
<body>
<form method="POST" enctype="multipart/form-data" action="cgi-bin/code_18877.pl">
<input type="file" name="file" size="50"> <input type="submit" value="Enviar" />
</form>
</body>
</html>
queda el programa así (una de las muchas formas de hacerlo): Using perl Syntax Highlighting #!/usr/bin/perl -w
use strict;
use warnings;
use diagnostics;
use CGI ':standard';
use CGI::Carp 'fatalsToBrowser';
## Constantes
my @extensiones = qw( gif jpg jpeg bmp png txt ); # Arreglo con extensiones de archivos que podemos recibir
my $dir = '/home/explorer.joaquinferrero.com/public_html/tmp'; # Directorio donde queremos estacionar los archivos
## Variables
my $fichero_a_recibir = param('file') || '';
## Proceso
foreach my $extension (@extensiones) {
if ($fichero_a_recibir =~ /\.$extension/) {
my $fh = upload('file');
if (!$fh && cgi_error) { # Ocurrió un error o el usuario abortó el envío
print header(-status => cgi_error);
exit 0;
}
my $fichero_a_grabar = "$dir/$fichero_a_recibir";
open OUT, ">$fichero_a_grabar" or die "ERROR: No puedo escribir $fichero_a_grabar: $!\n";
while (read($fh, my $buffer, 1024)) {
print OUT $buffer; # Copia
}
close OUT;
print header # Gracias
, start_html('Gracias por el envío')
, p("Gracias por el envío de $fichero_a_recibir")
, end_html
;
exit;
}
}
print header # Oops... algo fue mal
, start_html('ERROR')
, h1('Extensión incorrecta')
, p("Sólo se reciben archivos con extensiones: @extensiones")
, p("Archivo: [$fichero_a_recibir]")
, end_html
;
__END__
_________________ JF^D Perl programming
| Última edición por explorer el 2009-09-04 16:14 @718, editado 2 veces en total |
| ascii-art |
|
2009-09-04 16:39 @735 |
|
|
makhix
Perlero Nuevo
|
Registrado: 2009-08-06 15:13 @675 Mensajes: 26
|
|
|
Re: Malformed multipart POST: data truncated
|
Jajaja, perdiste la paciencia 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!) Jajaja, era eso. Bueno, para la próxima te prometo no ser tan gomoso... Te mando un abrazo y mil gracias por la ayuda. Juro que no posteo en una semana (aunque no lo puedo asegurar) jajaja  PD: ¡Buen fin de semana!
| Última edición por explorer el 2009-09-04 16:51 @744, editado 1 vez en total |
| Ortografía |
|
2009-09-07 21:35 @941 |
|
|
makhix
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... Y bueno, debe tener permiso de escritura sobre las carpetas el user guest. Pero es así la vida... Por lo demás, mil gracias.
|
|
Página 1 de 1
|
[ 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
|
|
Socializa |
 |
|