如何使用服务器端的Perl CGI脚本处理C#httpWebRequest Stream上传的文件?

时间:2011-11-03 14:29:58

标签: c# perl apache cgi

我正在尝试编写一个Perl CGI脚本,该脚本将客户端计算机上传的文件保存到服务器上的文件中。在客户端,C#代码使用httpWebRequest并通过流发送数据。

上传数据似乎没有与之关联的参数,所以我很难阅读它(我不知道C#)。在Stackoverflow搜索后,我设法使用

捕获数据
$query = CGI->new();
$data = $query->param('POSTDATA');

我现在可以直接将此数据写入文件

open ( FH, ">$filename" ) or die ("error opening file $filename: $!");
print FH $data;
close FH;

这适用于小尺寸文件。但是当POSTDATA包含大小超过500MB的大数据时,Perl CGI脚本会等待所有文件下载,然后将其写入文件。似乎POSTDATA包含整个文件。这会对系统内存造成压力。有没有其他方法来读取httpWebrequest流数据并将其写入文件?

1 个答案:

答案 0 :(得分:1)

CGI模块无法使用。另外,我不知道任何Perl CGI实现为您提供POST数据的流处理。

考虑切换到PSGI。 body method in Plack::Request为您提供了一个可以读取的文件句柄。


示例app(未经测试):

plackup -MIO::File::WithPath -MPlack::Request -MSys::Sendfile=sendfile -e '
    my $app = sub {
        my ($env) = @_;
        my $out = IO::File::WithPath->new("/tmp/out", "w") or die $!;
        my $req = Plack::Request->new($env);
        my $r = sendfile($out, $req->body) or die $!;
        return [200, [], []]
    }
'

lwp-request -m POST -c text/plain -USe http://localhost:5000 < /usr/src/linux/COPYING