gpt4 book ai didi

perl - 继续获取部分下载的文件

转载 作者:可可西里 更新时间:2023-11-01 16:10:30 26 4
gpt4 key购买 nike

是否有一个 Perl 工具,其行为类似于 wget --continue 并且能够继续获取部分下载的文件?

最佳答案

AnyEvent::HTTP的文档包含使用 HTTP 1.1 的能力来恢复下载的代码。不过我从未使用过它,所以我无法评论它的适用性。

显然这个例子希望你已经知道如何使用 AnyEvent ,当然,我不知道。您需要修改代码以使其预期的事件循环已经到位:

#!/usr/bin/perl

use strict;
use warnings;

use AnyEvent::HTTP;

my $url = "http://localhost/foo.txt";
my $file = "foo.txt";

sub download {
my ($url, $file, $cb) = @_;

open my $fh, "+>>:raw", $file
or die "could not open $file: $!";

my %hdr;
my $ofs = 0;

if (stat $fh and $ofs = -s _) {
$hdr{"if-unmodified-since"} = AnyEvent::HTTP::format_date((stat _)[9]);
$hdr{"range"} = "bytes=$ofs-";
}

http_get $url, (
headers => \%hdr,
on_header => sub {
my ($hdr) = @_;

if ($hdr->{Status} == 200 && $ofs) {
# resume failed
truncate $fh, $ofs = 0;
}

sysseek $fh, $ofs, 0;

return 1;
},
on_body => sub {
my ($data, $hdr) = @_;

if ($hdr->{Status} =~ /^2/) {
length $data == syswrite $fh, $data
or return; # abort on write errors
}

return 1;
},
sub {
my (undef, $hdr) = @_;

my $status = $hdr->{Status};

if (my $time = AnyEvent::HTTP::parse_date $hdr->{"last-modified"}) {
utime $fh, $time, $time;
}

if ($status == 200 || $status == 206 || $status == 416) {
# download ok || resume ok || file already fully downloaded
$cb->(1, $hdr);

} elsif ($status == 412) {
# file has changed while resuming, delete and retry
unlink $file;
$cb->(0, $hdr);

} elsif ($status == 500 or $status == 503 or $status =~ /^59/) {
# retry later
$cb->(0, $hdr);

} else {
$cb->(undef, $hdr);
}
}
);
}

my $quit = AnyEvent->condvar; #create a handle to exit the loop

download $url, $file, sub {
if ($_[0]) {
print "OK!\n";
} elsif (defined $_[0]) {
print "please retry later\n";
} else {
print "ERROR\n";
}
$quit->send; #quit the loop
};

$quit->recv; #start the loop

让它工作的关键是$quit条件变量:

my $quit = AnyEvent->condvar; #handle to exit the loop
.
.
.
$quit->recv;

这会设置一个事件循环。在没有事件循环的情况下,程序会在调用 http_get 有机会执行除创建文件之外的任何操作之前退出。要退出事件循环,我们在 download 函数的回调中调用 $quit->send

关于perl - 继续获取部分下载的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6813726/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com