Question

Comment pourrais-je écrire un script CGI Perl qui reçoit un fichier via une publication HTTP et l'enregistre dans le système de fichiers?

Était-ce utile?

La solution

Remarque: vous l'écrivez mais ne le sauvegardez pas dans un endroit accessible depuis votre serveur Web.

Et maintenant, voici le script ci-dessous que j'utilisais depuis quelque temps pour le téléchargement de photos. Cela pourrait nécessiter quelques ajustements, mais devrait vous montrer le chemin.

Comme l'image n'est pas téléchargée dans un répertoire accessible sur le Web, nous disposons alors d'un processus séparé pour la vérifier, la redimensionner, mettre un filigrane et le placer à un endroit où il est possible d'accéder.

 #!/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

Autres conseils

Utilisez le module CGI .

my $fh = $query->upload('upload_field');
while(<$fh>) {
  print SAVE_FILE 

Utilisez le module CGI .

<*>; }

Je commencerais par utiliser CGI et en lisant CRÉATION D'UN CHAMP DE TÉLÉCHARGEMENT DE FICHIER , en utilisant ouvrez pour créer un fichier et imprimer y écrire. (puis close pour le fermer).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top