2017-01-09 49 views
1

我想將文件上傳添加到現有的網頁上。網頁文件上傳總是被損壞

每當我上傳我得到一個損壞的文件。

我確保在文件句柄上設置binmode。我也有我的輸入enxtype設置爲multipart/formdata在我的形式。

我的代碼如下

$article{upload_file_name} = $cgi->param('upFile'); 
$article{upload_file}  = $cgi->upload('upFile'); 

if ($article{upload_file_name} ne "" or $article{upload_file_name} ne null) { 

    open(UPLOADS, ">$uploads_dir/$article{upload_file_name}") 
      or die "Could not open $uploads_dir/$article{upload_file_name}"; 

    binmode UPLOADS; 

    while (<$article{upload_file}>) { 
     print UPLOADS; 
    } 

    close UPLOADS; 
} 

我也試過這個

$article{upload_file} = $cgi->param('upFile'); 

if ($article{upload_file} ne "" or $article{upload_file} ne null) { 

    open(UPLOADS, ">$uploads_dir/$article{upload_file}") 
      or die "Could not open $uploads_dir/$article{upload_file}"; 
    binmode UPLOADS; 

    while (<$article{upload_file}>) { 
     print UPLOADS; 
    } 

    close UPLOADS; 
} 
+1

首先,您需要在腳本的頂部添加'use strict;'和'use warnings'all';';在Perl中沒有'null',所以'$ article {upload_file_name} ne null'檢查文件名是否等於文本文本「null」。 – ThisSuitIsBlackNot

+1

你是否有一個子程序或常量名稱爲'null'定義的地方?除非您不使用strict,否則您的文本行應該是語法錯誤。 Perl中沒有'null'。你想'undef',但是你不能用'ne'來檢查'undef'。事實上,執行if($ article {upload_file_name}){...}就足夠了,因爲只要有非空或者undef的值,這個值就是真的。 – simbabque

+0

參見[undef](http://p3rl.org/undef)和[defined](http://p3rl.org/defined)。 – choroba

回答

1
<$article{upload_file}> 

沒有做什麼你覺得它在做什麼。鑽石運算符(<>)用於代替Perl的readline函數,但它具有與Perl的glob函數完全相同的功能。在Perl的解析規則中,<$hash{key}>總是被視爲glob

perldoc -f perlop說明:

如果角度括號內什麼是既不是文件句柄,也不含有一個文件句柄名,類型團,或類型團參考簡單的標量變量,它被解釋爲一個文件名模式被晶片被保護,並根據上下文返回列表中的文件名列表或下一個文件名。這種區別僅在句法理由上確定。這意味着< $ x >始終是來自間接句柄的readline(),但< $ hash {key} >始終是glob()。這是因爲$ x是一個簡單的標量變量,但$ hash {key}不是 - 它是一個散列元素。即使< $ x >(注意額外的空間)被視爲glob(「$ x」),而不是readline($ x)。

至少有一對夫婦的解決方法:

  1. 使用顯式調用readline

    while (readline($article{upload_file})) 
    
  2. 分配文件句柄簡單的標量

    my $upload_fh = $article{upload_file}; 
    ... 
    while (<$upload_fh>) 
    
+0

謝謝,這正是它的原因。當我遇到一個奇怪的錯誤時,我開始懷疑與哈希有關的東西。 'my%hash(action => $ cgi-> param('action'));'正在返回「Action」而不是「」。但是,當我設置我的哈希像這樣...'我%哈希; $ hash {action} = $ cgi-> param('action');'我得到了我的預期結果。就在我們討論這個話題時,這與你指出的glob情景有關? – gregnnylf94

+0

@ gflynn94:請不要將Stack Overflow視爲論壇。這是一個問題和答案的彙編,更像*維基百科*。只有在你認爲自己可能對世界其他地方有用的情況下,你才應該在這裏添加詞語,並且你應該把你的提交作爲永久性公共文件來寫。 – Borodin

+0

@mob:我會去'$ article {upload_file} - > readline',因爲'IO :: File'自從Perl v5.14開始按需加載。 – Borodin