2009-12-21 27 views

Trả lời

8

Rất cám ơn đến Peter Kovacs' câu trả lời cho hàng đầu tôi đến câu trả lời đúng. Hóa ra nó phức tạp hơn một chút so với những gì tôi mong đợi, vì vậy tôi quyết định (kinh dị) trả lời câu hỏi của chính mình.

Như Peter cho thấy, tôi có thể thiết lập một callback như vậy:

$m->get($u, ":content_cb" => \&callback); 

Nhưng bây giờ tôi không thể lưu nội dung bằng cách sử dụng: Giá trị content_file, bởi vì tôi chỉ có thể chọn một trong hai. Hàm gọi lại được truyền dữ liệu và cuối cùng tôi đã ghi nó vào một tệp.

Tôi cũng nhận được đối tượng phản hồi chứa tổng kích thước của nội dung như đã được chỉ ra. Vì vậy, bằng cách giữ tổng số nội dung đang chạy nhận được cho đến thời điểm này và chia cho nội dung tổng cộng, tôi có thể tìm hiểu phần trăm nội dung đã được tải xuống. Đây là chức năng gọi lại đầy đủ:

open (VID,">$i.flv") or die "$!"; 
$total = 0; 
sub callback 
{ 
    my($data, $response, $proto) = @_; 
    print VID "$data"; # write data to file 
    $total+= length($data); 
    $size = $response->header('Content-Length'); 
    print floor(($total/$size)*100),"% downloaded\n"; # print percent downloaded 
} 

Tôi hy vọng sẽ giúp ai đó.

+0

Điều này giúp ích. Cảm ơn :) – Mike

+0

Điều này phù hợp với tôi. Tôi đã có thể sử dụng các tập tin xử lý như một tập tin tạm thời chỉ cho số liệu thống kê. Tôi sử dụng '\ r' để backspace và giữ thiết bị đầu cuối ở một dòng khi tỷ lệ phần trăm tải xuống tăng lên và tất cả những gì tôi đã làm sau' $ m-> get ($ u, ": content_cb" => \ & gọi lại); $ m-> save_content ($ newLocation); 'Điều này không tải xuống nội dung hai lần. Đã thử nghiệm trên một tệp 250M. – DataHerder

8

WWW::Mechanize nói rằng phương pháp get là quá tải "được xử lý tốt" của LWP :: UserAgent get. Nhìn vào các tài liệu cho LWP :: UserAgent, bạn có thể cung cấp một phím content_cb mà được gọi với mỗi đoạn của tập tin tải về:

$mech->get($someurl, ":content_cb" => \&callback); 
sub callback 
{ 
    my($data, $response, $proto) = @_; 
    # save $data to $i.flv 
    # print download notification 
} 
+1

Bạn cũng cần một cái gì đó để có được tổng kích thước (nếu có từ tiêu đề phản hồi http) – ysth

+4

Bạn có thể nhận được kích thước dễ dàng bằng cách xem tiêu đề '$ mech-> response-> ('Content-Length') ', giả sử máy chủ gửi tiêu đề đó. (Đối với nội dung động, bạn có thể không may mắn.) – friedo

Các vấn đề liên quan