2013-04-04 70 views
0

我有一個perl CGI腳本,可以將PC上的文件上傳到Linux服務器。Perl HTML文件上傳問題。文件大小爲零

它的工作原理與我在我自己的HTML表單中編寫對CGI的調用然後執行時完全一樣,但是當我將相同的調用放入現有的應用程序中時,該文件在服務器上創建,但沒有獲得數據,它的大小爲零。

我比較了環境變量(那些我可以從%ENV中提取的),並且沒有看起來像是一個原因。實際上,我嘗試在我自己的HTML腳本中更改幾個ENV,以改變現有應用程序正在使用的值,但這並未顯示出問題。

日誌沒有給我提供線索,上傳操作認爲它是成功的。 兩個測試的用戶都是相同的。如果權限是一個問題,那麼該文件甚至不會在服務器上創建。

IE中的結果與Chrome中的結果相同(從我自己的HTML腳本開始,而不是在應用程序中)。

我應該看什麼具體的設置,比較?

這是上傳代碼:

if (open(UPLOADFILE, ">$upload_dir/$fname")) { 
    binmode UPLOADFILE; 

    while (<$from_fh>) { 
     print UPLOADFILE; 
    } 
    close UPLOADFILE; 
    $out_msg = "Done with Upload: upload_dir=$upload_dir fname=$fname"; 
} 
else { 
    $out_msg = "ERROR opening for upload: upload_dir=$upload_dir filename=$filename"; 
} 

我沒有驗證

  • 它不進入while循環,從應用程序中運行時。
  • 它從我自己的HTML腳本中調用時會進入while循環。

$from_fh的值對於兩次運行都是相同的。 下面的塊中使用的所有值在兩次運行中都完全相同。

+0

你從哪裏得到'$ from_fh'?它讓我擔心你說它的價值在兩種情況下都是一樣的,因爲它應該是不同的,並且會像GLOB(0x90c06c)' – Borodin 2013-04-05 01:15:20

+0

那麼你在Windows PC上運行Web瀏覽器,並且想要上傳該PC上的文件到運行Web服務器的Linux系統? – Borodin 2013-04-05 01:17:41

回答

0

你可以檢查你打開的錯誤結果嗎?

my $err; 
open(my $uploadfile, ">", "$upload_dir/$fname") or $err = $!; 
if (!$uploadfile) { 
    my $out_msg = "ERROR opening for upload: upload_dir=$upload_dir filename=$filename: $err"; 
} 
else { 
    ### Stuff 
    ...; 
} 
+0

雖然有代碼來檢查該打開命令的值是一個好主意,但該打開命令成功。這是打開它正在寫入的文件,它已成功創建。 – user2234591 2013-04-04 23:09:55

+0

他已經這麼做了。 'open'是'if'語句的條件。 – Borodin 2013-04-05 01:13:37

0

我的猜測,根據您將它嵌入在另一個應用程序的事實是,所有的輸入已經被一些功能,是其他應用程序的一部分已經被讀取。例如,如果我試圖將這個程序作爲CGI腳本的一部分使用,並且我使用了CGI.pm中的param()函數,那麼整個文件上傳就已經被讀取了。所以如果我自己的代碼試圖再次讀取文件,它會收到零數據,因爲數據已經準備好了。