tôi sử dụng WWW :: Curl để tải lên tập tin:www :: curl - làm thế nào để tải lên (bài) các tập tin lớn
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);
có gì đặc biệt ở đây và mã này hoạt động tốt.
Tôi muốn tải lên các tệp lớn và tôi không muốn tải trước mọi thứ trong bộ nhớ. Ít nhất đó là những gì tôi nghe nói rằng libcurl đang làm.
CURLOPT_READFUNCTION chấp nhận cuộc gọi lại trả về các phần của nội dung. Điều đó có nghĩa rằng tôi không thể sử dụng WWW :: Curl :: Form để thiết lập các thông số POST nhưng tôi phải trả lại toàn bộ nội dung thông qua cuộc gọi lại này. Có đúng không?
Tôi nghĩ rằng mã có thể trông như thế này:
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;
});
Những dữ liệu không CURLOPT_READFUNCTION gọi lại phải quay trở lại? $ params + File (s) nội dung? Ở định dạng nào?
Tôi có thực sự phải tự tạo dữ liệu (được trả về bởi CURLOPT_READFUNCTION) hoặc có cách đơn giản để tạo nó theo đúng định dạng không?
Cảm ơn
Bạn có cam kết sử dụng WWW :: Curl không? Tôi nghĩ rằng điều này sẽ dễ dàng hơn với LWP, nếu bạn có thể chuyển đổi. – wes
LWP hoặc sử dụng tốt hơn WWW :: Cơ chế –
Tôi biết câu trả lời này không liên quan trực tiếp đến mã của bạn, nhưng tôi đã dành một lượng đáng kể thời gian khắc phục sự cố tương tự bằng cách sử dụng WWW :: Cơ chế chỉ để phát hiện ra MaxPostSize trên máy chủ web được quản trị viên của chúng tôi đặt cho một số giới hạn tùy ý. – AWT