【问题标题】:Tricky Issue Handling File Upload in Perl在 Perl 中处理文件上传的棘手问题
【发布时间】:2023-03-20 08:10:01
【问题描述】:

我们使用 CGI.pm 来帮助我们处理在我们的网站上以及通过我们的 Android 和 iPhone 应用程序使用的 API 上传的文件。我们最近注意到,对于通过我们的 iPhone 应用程序上传的近 50% 的文件,CGI.pm 似乎没有返回任何参数。我们没有发现通过我们的网站上传的这些文件存在类似问题。

我们无法在测试中复制该问题,但在生产中 CGI.pm 的 cgi_error() 方法在缺少 CGI.pm 参数的情况下不会报告任何错误。我们已确认 iPhone 应用在 POST 上传文件时始终包含正确的参数。

设置的快速背景。我们在 Amazon EC2 服务器上部署了应用程序,这些服务器正在使用 Amazon Elastic Load Balancer 进行负载均衡。我们还有 $CGI::POST_MAX=(1024*100000);因此 POST 最大大小设置为 100MB,我们已确认所有上传都在此限制之下。

我不确定下一步该去哪里。任何关于问题可能是什么以及如何解决它的想法将不胜感激。有关如何确定问题根源的任何想法也很有帮助,以便我们开始进行故障排除。

提前感谢您的帮助!

【问题讨论】:

  • 当您说 CGI.pm 对 50% 的上传文件没有返回任何参数时,您能澄清一下您的意思吗?除了文件数据之外的参数是否丢失,或者 CGI.pm 没有任何可用的数据?错误日志是否显示这些请求有任何错误?
  • CGI.pm 绝对没有返回任何参数,即使我们已验证所有参数都已由 iPhone 应用程序正确提交。错误日志没有报告任何内容,cgi_error() 方法也没有报告,这就是我们如此卡住的原因。
  • 多部分 MIME 编码之前还是之后的 100MB?
  • 不知道,但从 iPhone 上传的照片都小于 10MB,所以这并不重要。

标签: perl post file-upload cgi


【解决方案1】:

没有记录错误的参数丢失正是 CGI 模块在处理 POST 数据时遇到错误的症状 - 例如 POST 超过 $CGI::POST_MAX。您是在功能模式下通过调用 param() 使用 CGI.pm,还是在面向对象模式下调用 $cgi->param()?关于 cgi_error(),perldoc CGI 警告:当使用面向函数的接口时,错误可能只会在你第一次调用 param() 时发生。做好准备!

至于调试,如果您怀疑 CGI.pm 掩盖了您的错误,请在执行任何其他操作之前尝试查看 CGI 对象:

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

在 CGI 对象的转储中,您会看到如下错误:'.cgi_error' => '413 Request entity too large' - 这是 cgi_error() 将返回的 POST_MAX 超出。

另外,如果使用 Modperl,请注意 CGI 可以在对不同应用程序的请求之间转换为 $CGI::POST_MAX 等值。 (但是,由于您在自己的文件中指定了 POST_MAX,这似乎不是您的问题。)

【讨论】:

    【解决方案2】:

    我们也看到CGI.pm 出现同样的行为,尽管我们曾认为问题仅限于 IE。通过添加$CGI::POST_MAX=5000000 解决。过度杀戮,因为它只是一个 50k 的文件被传来传去。

    【讨论】:

      猜你喜欢
      • 2011-04-15
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 2012-03-07
      • 1970-01-01
      • 2011-10-26
      • 2011-07-19
      • 1970-01-01
      相关资源
      最近更新 更多