utilizo WWW :: Curl para subir archivos:www :: rizo - cómo cargar (post) archivos de gran tamaño
use WWW::Curl::Easy 4.14;
use WWW::Curl::Form;
my $url = 'http://example.com/backups/?sid=12313qwed323';
my $params = {
name => 'upload',
action => 'keep',
backup1 => [ '/tmp/backup1.zip' ], # 1st file for upload
};
my $form = WWW::Curl::Form->new();
foreach my $k (keys %{$params}) {
if (ref $params->{$k}) {
$form->formaddfile(@{$params->{$k}}[0], $k, 'multipart/form-data');
} else {
$form->formadd($k, $params->{$k});
}
}
my $curl = WWW::Curl::Easy->new() or die $!;
$curl->setopt(CURLOPT_HTTPPOST, $form);
$curl->setopt(CURLOPT_URL, $url);
my $body;
$curl->setopt(CURLOPT_WRITEDATA, \$body);
my $retcode = $curl->perform();
my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
tiene nada de especial y este código funciona bien.
Quiero cargar archivos de gran tamaño y no quiero cargar todo en la memoria. Al menos eso es lo que escuché que libcurl está haciendo.
CURLOPT_READFUNCTION acepta devoluciones de llamada que devuelve partes del contenido. Eso significa que no puedo usar WWW :: Curl :: Form para establecer los parámetros de POST, pero que tengo que devolver todo el contenido a través de esta devolución de llamada. ¿Está bien?
creo que el código podría tener este aspecto:
use WWW::Curl::Easy 4.14;
my $url = 'http://example.com/backups/?sid=12313qwed323'
my $params = {
name => 'upload',
action => 'keep',
backup1 => [ '/tmp/backup1.zip' ], # 1st file for upload
};
my $fields;
foreach my $k (keys %{$params}) {
$fields .= "$k=".(ref $params->{$k} ? '@'[email protected]{$params->{$k}}[0] : uri_escape_utf8($params->{$k}))."&";
}
chop($fields);
my $curl = WWW::Curl::Easy->new() or die $!;
$curl->setopt(CURLOPT_POST, 1);
$curl->setopt(CURLOPT_POSTFIELDS, $fields); # is it needed with READFUNCTION??
$curl->setopt(CURLOPT_URL, $url);
my @header = ('Content-type: multipart/form-data', 'Transfer-Encoding: chunked');
$curl->setopt(CURLOPT_HTTPHEADER, \@header);
#$curl->setopt(CURLOPT_INFILESIZE, $size);
$curl->setopt(CURLOPT_READFUNCTION, sub {
# which data to return here?
# $params (without file) + file content?
return 0;
});
¿Qué datos de devolución de llamada CURLOPT_READFUNCTION tiene que volver? $ params + archivo (s) de contenido? ¿En que formato?
¿Realmente tengo que crear los datos (devueltos por CURLOPT_READFUNCTION) por mi cuenta o hay una manera simple de crearlos en el formato correcto?
Gracias
¿Está comprometido con el uso de WWW :: Curl? Creo que esto sería más fácil con LWP, si puedes cambiar. – wes
LWP o mejor uso WWW :: Mechanize –
Sé que esta respuesta no está directamente relacionada con su código, pero pasé una gran cantidad de tiempo solucionando un problema similar usando WWW :: Mechanize solo para descubrir que MaxPostSize en el servidor web tenía sido establecido por nuestro administrador a algún límite arbitrario. – AWT