2012-02-15 54 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的文件被传回来,