
Today I created a good wrapper for request body upload HTTP::Request.
this module is use few memory on file upload. also too big file.
http://search.cpan.org/dist/HTTP-Request-StreamingUpload/
http://github.com/yappo/p5-HTTP-Request-StreamingUpload
DESCRIPTION
HTTP::Request::StreamingUpload is streaming upload wrapper for HTTP::Request. It could be alike when $DYNAMIC_FILE_UPLOAD of HTTP::Request::Common was used. However, it is works only for POST method with form-data. HTTP::Request::StreamingUpload works on the all HTTP methods. Of course, you can big file upload using few memory by this wrapper.SYNOPSIS
my $req = HTTP::Request::StreamingUpload->new(
PUT => 'http://example.com/foo.cgi',
path => '/your/upload.jpg',
headers => HTTP::Headers->new(
'Content-Type' => 'image/jpeg',
'Content-Length' => -s '/your/upload.jpg',
),
);
my $res = LWP::UserAgent->new->request($req);
LWPとか使って大きなファイルアップロードするときは$HTTP::Request::Common::DYNAMIC_FILE_UPLOAD使ってアップロードするとメモリに優しくアップロードできるってのは有名ですが、あれってform-dataの時しかやってくれないので、例えばPUTメソッドでデッカいファイル送りたい時には使えません。
HTTP::Request->new( PUT => $uri, $headers, sub { read $fh, my $buf, 1978; $buf } )とか書けば出来るんですが、毎回書くのもうっとおしいので、同じ事をHTTP::Request::StreamingUpload->new( PUT => $uri, headers => $headers, fh => $fh )で出来るようにしたんです。
Content-Length を入れない場合は LWP::UserAgent の中で使ってる LWP::Protocol::http が chunked で送ってくれるので、予め送りたいサイズが解らない場合でも安心して使えます。
Posted by Yappo at 2009年10月09日 12:45 | TrackBack | Perl