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?

¿Fue útil?

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).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top