【问题标题】:How to handle file being uploaded by C# httpWebRequest Stream using Perl CGI script on the server side?如何在服务器端使用 Perl CGI 脚本处理 C# httpWebRequest Stream 上传的文件?
【发布时间】:2011-11-04 02:51:14
【问题描述】:

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

【问题讨论】:

    标签: c# perl apache cgi


    【解决方案1】:

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

    考虑切换到 PSGI。 body method in Plack::Request 给你一个文件句柄来读取。


    示例应用(未经测试):

    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
    

    【讨论】:

    • 感谢回复,我会尽快试用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2012-05-31
    • 2023-03-17
    • 2018-11-04
    • 2019-08-06
    • 1970-01-01
    • 2014-10-13
    相关资源
    最近更新 更多