2010-01-14 33 views
0

我正嘗試構建一個桌面客戶端,該客戶端使用Ruby管理一些下載。我想知道如何着手確定下載了多少數據以及要下載的整個數據的大小。如何計算下載的數據量以及要下載的Ruby數據總量

我試圖用Ruby做到這一點,所以任何幫助將是有用的。

在此先感謝。

+3

如何傳輸文件? (ftp,ssh,telnet,自定義tcp/ip協議等)?您是否使用寶石或其他圖書館代碼進行轉賬? – 2010-01-14 14:48:55

+0

大部分時間你會得到一個Content-Length頭,但有時它不會被返回。如果服務器或服務器調用的CGI無法預先確定要返回的數據的大小,那麼您將什麼都得不到。因此,編寫代碼的方式可以正確處理這種情況。 – 2011-01-03 22:41:07

回答

1

如果您使用的是Net :: HTTP,那麼您請求的長度應該在響應頭中。 Net :: HTTP mixin NET :: HTTPHeader,在這裏你會找到content_length()。雖然只有在傳輸發生之前確定大小,它纔有用。

Net :: HTTPResponse有一個方法可以讀取塊中的正文,因此您可以使用它來確定進度。從0開始,並添加每個塊的長度,將其與總大小進行比較,即可完成。

http.request_get('/index.html') {|res| 
res.read_body do |segment| 
    print segment 
end 
} #Example taken from Ruby-Documentation 

如果您使用的是FTP,那麼NET :: FTP應該更容易。連接到服務器,獲取大小(文件名)的給定文件的大小,然後使用get,getbinaryfile或gettextfile下載文件。這是get方法的簽名:get(remotefile,localfile = File.basename(remotefile),blocksize = DEFAULT_BLOCKSIZE){| data | ...}

ftp.get('file.something', 'file.something.local', 1024){ |data| 
    puts "Downloaded 1024 more bytes" 
} 
+0

''//!-comments ) – Nakilon 2010-12-25 11:18:01

+0

對,對不起,那:( – pgmura 2011-01-03 21:32:26

2

像韋恩在他的評論中說,它取決於用於傳輸文件的協議。以HTTP爲例,HTTP響應將包含一個Content-Length標頭,它會告訴你正在下載的文件的長度。知道後,您將不得不跟蹤您從HTTP連接中讀取的字節數。

像這樣的事情似乎工作(用於HTTP),但我不會感到驚訝,如果它可以更優雅的完成:

require 'net/http' 

url = URI.parse('http://www.google.com/index.html') 
req = Net::HTTP::Get.new(url.path) 
res = Net::HTTP.start(url.host, url.port) do |http| 
    http.request(req) do |res| 
    remaining = res.content_length 
    puts "total length: #{remaining}" 
    res.read_body do |segment| 
     puts "read #{segment.length} bytes" 
     remaining = remaining - segment.length 
     puts "#{remaining} bytes remaining" 
    end 
    end 
end 

www.google.com/index.html是一個壞榜樣因爲內容會在一個段中返回,但在較大的對象上嘗試它並且您應該看到多個「read ...」行。

+0

您不能指望存在Content-Length標頭。如果CGI正在返回內容,他們可能沒有實現它,如果內容是動態的,服務器可能無法確定實際大小。 OMG! – 2011-01-03 22:38:10