2012-12-18 162 views
1

我正在使用perl將文件上傳到服務器,然後解析它以獲取信息。該頁面是CGI腳本,我使用的Perl模塊
使用perl從路徑中提取文件名(IE8瀏覽器)

use File::Basename; 

我的服務器端代碼:

my $path = $cgi->param('filename'); 
my $filename = basename($path); 
if ($filename) { 
    if ($filename =~ /.csv/i) {do nothing;} 
    else { 
    $error = 'please upload a csv file'; 
    push @error, $error; 
    } 
} 

我已經嘗試了一切,代碼運行正常在Chrome,Safari, Firefox,但是當我在IE8上測試它時。文件名稱更改爲完整的路徑名稱。所以例如C:/meetup/sf/perl.csv是完整的路徑。在CSF中,文件名顯示爲perl.csv,但在IE8中顯示爲:C:/meetup/sf/perl.csv

有人可以幫助我找出正確的方法來獲取文件名它在所有瀏覽器中正確顯示。

感謝,
Parik

+0

'/ .csz/i'應該是'/ \財稅字\ Z/i',我不知道。看看爲什麼即使你有完整的路徑也不能使用它。 – ikegami

回答

1

另一種方法是使用Path::Class,這是明確了跨平臺的路徑處理。

use Path::Class 'file'; 
my $filename = file($path)->basename; 
+0

steveni,我使用的服務器是Sun和perl版本是5.8.4。當我使用上面的代碼時,它使我無法在@INC錯誤中找到Path/Class.pm。我需要單獨安裝這個軟件包嗎? –

+0

是的,這不是核心模塊。如果安裝時遇到問題,請嘗試內部使用Path :: Class使用的[File :: Spec](https://metacpan.org/module/File::Spec) - > splitpath()。 – stevenl

0

問題是unix/windows路徑分隔符。而不是通常的/分開的組件IE8傳遞可能傳遞它作爲\。

您可能能夠做這樣的事情來實現通用的解決方案:

my $path = $cgi->param('filename'); 
    # replace all occurences of \ with/chrome/firefox etc won't be affected 
    #because they wont have any \ delimiters 
    $path =~ s/\\/\//g; 

    my ($name,$parsed_path,$suffix) = fileparse($path,@suffixlist); 
    print "name $name \n"; # this should carry the name of the file eg perl.csv 
+0

我確實使用了相同的東西,將所有的分隔符替換爲常見的std,但仍然是同一個問題! –

+0

Hi Parik你從#cgi-> param得到它後是否直接打印$ path?查看文件名實際包含的內容,並與文件名中的Chrome/Firefox返回值進行比較。 –

相關問題