0

我有一个 perl CGI 脚本,它可以将文件从 PC 上传到 Linux 服务器。

当我以自己的 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相同。以下块中使用的所有值对于两次运行都完全相同。

4

2 回答 2

0

我的猜测是,基于您将其嵌入另一个应用程序的事实,所有输入都已被其他应用程序的某些功能读取。例如,如果我尝试将此程序用作 CGI 脚本的一部分,并且我使用了 CGI.pm 中的 param() 函数,那么整个文件上传就已经被读取了。因此,如果我自己的代码再次尝试读取该文件,它将收到零数据,因为数据已经准备好。

于 2013-04-05T02:02:29.357 回答
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
  ...;
}
于 2013-04-04T21:22:12.857 回答