2012-02-15 35 views
1

我們使用CGI.pm來幫助我們在我們的網站上處理文件上傳,並通過我們的Android應用程序使用我們的API & iPhone應用程序。我們最近注意到,CGI.pm似乎沒有返回幾乎50%的文件通過我們的iPhone應用程序上傳的參數。我們還沒有看到與通過我們網站上傳的文件類似的問題。棘手的問題處理文件在Perl上傳

我們不能在測試中複製問題,但在生產中CGI.pm的cgi_error()方法在缺少CGI.pm參數的情況下不報告任何錯誤。我們已確認iPhone應用程序在發佈上傳文件時始終包含正確的參數。

快速設置背景。我們將應用程序分配到使用Amazon Elastic Load Balancer進行負載平衡的Amazon EC2服務器上。我們也有$ CGI :: POST_MAX =(1024 * 100000);所以POST最大大小設置爲100MB,我們已確認所有上傳都在此限制之下。

我不知道下一步該去哪裏。關於這個問題可能是什麼以及如何解決它的任何想法都將非常感謝。對於如何識別問題的根源也有幫助,因此我們可以開始排除故障。

在此先感謝您的幫助!

+0

當您說CGI.pm上傳的文件的50%沒有返回參數時,能澄清一下您的含義嗎?那些params是不是文件數據丟失,或者沒有簡單的數據給CGI.pm?錯誤日誌是否顯示這些請求有任何錯誤? – kbenson 2012-02-15 05:03:26

+0

儘管我們已經驗證了所有參數都被iPhone應用程序正確提交,但CGI.pm完全沒有返回參數。錯誤日誌不報告任何內容,也不是cgi_error()方法,這就是爲什麼我們被困住了。 – 2012-02-15 15:38:54

+0

在多部分MIME編碼之前或之後是100MB嗎? – daxim 2012-02-15 18:27:35

回答

1

沒有記錄錯誤的參數丟失正是CGI模塊在處理POST數據時遇到錯誤的症狀 - 例如超過$ CGI :: POST_MAX的POST。你是通過調用param()還是調用$ cgi-> param()的面向對象模式在函數模式下使用CGI.pm?關於cgi_error(),perldoc CGI警告:當使用面向函數的接口時,只有在您第一次調用param()時纔會發生錯誤。準備好這個!

至於調試,如果你懷疑CGI.pm被掩蓋從你的錯誤,嘗試做任何事情之前在看CGI對象:

use Data::Dumper; 
my $cgi = CGI->new(); 
warn Dumper($cgi); 

內CGI對象的轉儲,你會看到一個錯誤如下:'.cgi_error'=>'413請求實體太大' - 這是cgi_error()將超過POST_MAX返回的值。

另外,如果使用Modperl,請注意CGI可以在請求到不同應用程序的請求之間到達諸如$ CGI :: POST_MAX之類的值。 (但是,由於您正在爲您指定POST_MAX,所以這不會是您的問題。)

0

我們也看到與CGI.pm相同的行爲,儘管我們認爲問題僅限於IE。通過添加$CGI::POST_MAX=5000000來解決。因爲它只有一個50k的文件被傳回來,