2009-06-26 8 views
2

Le nom de fichier transmis d'un formulaire de téléchargement à un script CGI Perl (à l'aide de CGI.pm) dépend de l'ordinateur client et peut contenir des séparateurs de chemin dépendant du client. Existe-t-il un moyen fiable d'analyser le paramètre passé pour déterminer le nom du fichier (généralement la dernière sous-chaîne suivant le dernier séparateur de chemin)?Comment déterminer de manière fiable le nom d'un fichier téléchargé dans un script CGI Perl?

Répondre

4

J'ai seulement rencontré le problème avec les séparateurs de chemin lorsque le client utilise MSIE (impliquant des chemins Windows). J'ai utilisé une expression régulière assez simple pour gérer cela. Cependant, vous pouvez étendre l'expression régulière (ou même diviser) pour gérer les séparateurs de chemin les plus courants - '/', '\' et occasionnellement ':'. Vous pouvez également définir le type de système de fichiers à partir de la chaîne useragent (en utilisant éventuellement HTTP::DetectUserAgent ou HTTP::BrowserDetect). Étant donné que vous pouvez appeler la fonction fileparse_set_fstype de File :: BaseName avant d'analyser le fichier.

Quelque chose comme:

use File::Basename; 
use HTTP::BrowserDetect; 

# ... get the filename into $upload_file and agent into $user_agent_string. 

my $browser = HTTP::BrowserDetect->new($user_agent_string); 

my $ostype; 

$ostype = 'MSWin32' if $browser->windows; 
$ostype = 'Unix' if $browser->unix; 
# There are more tests available. 

fileparse_set_fstype($ostype); 

my $filename = basename($upload_file); 
+0

Merci Newt. HTTP :: DetectUserAgent en conjonction avec File :: BaseName semble être le chemin à parcourir. –