Как обработать файл, загружаемый C # httpWebRequest Stream, с помощью сценария Perl CGI на стороне сервера? - PullRequest
1 голос
/ 03 ноября 2011

Я пытаюсь написать сценарий 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 содержит большие данные размером более 500 МБ, сценарий Perl CGI ожидает загрузки всего файла и затем записывает его в файл. Кажется, POSTDATA содержит весь файл. Это вызывает нагрузку на системную память. Есть ли другой способ прочитать данные потока httpWebrequest и записать их в файл?

1 Ответ

1 голос
/ 03 ноября 2011

Невозможно с модулем CGI .Кроме того, я не знаю ни о какой реализации Perl CGI, которая дает вам ручку потоковой передачи для данных POST.

Рассмотрите возможность переключения на PSGI.Метод body в 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
...