¿Cómo puedo manejar las cargas de archivos HTTP?
-
03-07-2019 - |
Pregunta
¿Cómo escribiría un script Perl CGI que recibe un archivo a través de una publicación HTTP y lo guarda en el sistema de archivos?
Solución
Solo una nota: de cualquier forma que lo escriba, no guárdelo en un lugar accesible desde su servidor web.
Y ahora al punto: a continuación hay un script que estuve usando durante un tiempo para subir fotos. Podría necesitar algunos ajustes, pero debería mostrarle el camino.
Como la imagen no se ha cargado en un directorio accesible a través de la web, tenemos un proceso separado que lo revisa, le cambia el tamaño, le pone una marca de agua y lo coloca donde se puede acceder.
#!/usr/bin/perl -wT
use strict;
use CGI;
use CGI::Carp qw ( fatalsToBrowser );
use File::Basename;
$CGI::POST_MAX = 1024 * 5000;
my $safe_filename_characters = "a-zA-Z0-9_.-";
my $upload_dir = "/home/www/upload";
my $query = new CGI;
my $filename = $query->param("photo");
my $email_address = $query->param("email_address");
if ( !$filename )
{
print $query->header ( );
print "There was a problem uploading your photo (try a smaller file).";
exit;
}
my ( $name, $path, $extension ) = fileparse ( $filename, '\..*' );
$filename = $name . $extension;
$filename =~ tr/ /_/;
$filename =~ s/[^$safe_filename_characters]//g;
if ( $filename =~ /^([$safe_filename_characters]+)$/ )
{
$filename = $1;
}
else
{
die "Filename contains invalid characters";
}
my $upload_filehandle = $query->upload("photo");
open ( UPLOADFILE, ">$upload_dir/$filename" ) or die "$!";
binmode UPLOADFILE;
while ( <$upload_filehandle> )
{
print UPLOADFILE;
}
close UPLOADFILE;
print $query->header ( );
print <<END_HTML;
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Thanks!</title>
</head>
<body>
<p>Thanks for uploading your photo!</p>
</body>
</html>
END_HTML
Otros consejos
Utilice el módulo CGI .
my $fh = $query->upload('upload_field');
while(<$fh>) {
print SAVE_FILE Utilice el módulo CGI .
<*>;
}
Comenzaría utilizando CGI y leyendo CREAR UN ARCHIVO UPLOAD FIELD , y usar abrir para crear un archivo y imprimir escribirle. (y luego cerrar para cerrarlo).