我正在尝试编写一个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流数据并将其写入文件?
答案 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