Как я могу надежно определить имя загруженного файла в скрипте Perl CGI? - PullRequest
2 голосов
/ 26 июня 2009

Имя файла, передаваемого из формы загрузки в сценарий Perl CGI (с использованием CGI.pm), зависит от клиентского компьютера и может содержать зависимые от клиента разделители пути. Существует ли надежный способ синтаксического анализа переданного параметра для определения имени файла (обычно последняя подстрока, следующая за последним разделителем пути).

1 Ответ

4 голосов
/ 26 июня 2009

У меня когда-либо возникала проблема с разделителями путей, когда клиент использует MSIE (подразумевает пути Windows). Я использовал довольно простое регулярное выражение, чтобы справиться с этим. Тем не менее, вы можете расширить регулярное выражение (или даже разделить) для обработки наиболее распространенных разделителей пути - '/', '\' и случайных ':'.

Кроме того, вы должны иметь возможность определить тип файловой системы из строки useragent (возможно, используя HTTP :: DetectUserAgent или HTTP :: BrowserDetect ). Учитывая, что вы можете вызвать функцию fileparse_set_fstype в File :: BaseName перед анализом файла.

Что-то вроде:

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