Câu hỏi Nhận kích thước tệp trước khi tải xuống và đếm số lượng đã tải xuống (http + ruby)


Ai có thể giúp tôi

  • nhận được kích thước tệp trước Tôi bắt đầu tải xuống
  • hiển thị bao nhiêu % đã được tải xuống

.

require 'net/http'
require 'uri'

url = "http://www.onalllevels.com/2009-12-02TheYangShow_Squidoo_Part 1.flv"

url_base = url.split('/')[2]
url_path = '/'+url.split('/')[3..-1].join('/')

Net::HTTP.start(url_base) do |http|
  resp = http.get(URI.escape(url_path))
  open("test.file", "wb") do |file|
    file.write(resp.body)
  end
end
puts "Done."

10
2018-02-20 04:12


gốc




Các câu trả lời:


Sử dụng phương thức request_head. Như thế này

response = http.request_head('http://www.example.com/remote-file.ext')
file_size = response['content-length']

File_size sẽ bằng byte.

Thực hiện theo hai liên kết này để biết thêm thông tin.

http://ruby-doc.org/stdlib/libdoc/net/http/rdoc/classes/Net/HTTP.html#M000695

http://curl.haxx.se/mail/archive-2002-07/0070.html


19
2018-02-20 04:21



@GeekTantra: phản hồi ['content-length'] hoạt động tốt. Cảm ơn bạn. Tôi đã cố gắng để hiển thị 'phản ứng' và nó đã cho tôi không có gì. Câu hỏi lớn bây giờ là làm thế nào tôi có thể đếm những gì đã được tải xuống .... - Radek
Đó là không thể. Đó là trách nhiệm của máy chủ để đặt Content-Length tiêu đề. Nếu http://www.onalllevels.com là dưới sự kiểm soát của bạn, sửa chữa nó, khác cố gắng liên hệ với họ và yêu cầu họ sửa chữa. - BalusC
Tôi đã nói rằng máy chủ doesnt phải cung cấp` content-length  w3.org/Protocols/rfc2616/rfc2616-sec14.html sử dụng từ NÊN gửi ... - Radek
Không phải là Content-Length bị thiếu nếu mã hóa đoạn mã được sử dụng? - Zepplock
cái gì thế http đây? - アレックス


vì vậy tôi đã làm cho nó hoạt động ngay cả với thanh tiến trình ....

require 'net/http'
require 'uri'
require 'progressbar'

url = "url with some file"


url_base = url.split('/')[2]
url_path = '/'+url.split('/')[3..-1].join('/')
@counter = 0

Net::HTTP.start(url_base) do |http|
  response = http.request_head(URI.escape(url_path))
  ProgressBar#format_arguments=[:title, :percentage, :bar, :stat_for_file_transfer]
  pbar = ProgressBar.new("file name:", response['content-length'].to_i)
  File.open("test.file", 'w') {|f|
    http.get(URI.escape(url_path)) do |str|
      f.write str
  @counter += str.length 
  pbar.set(@counter)
    end
   }
end
pbar.finish
puts "Done."

4
2018-02-20 06:15





Kích thước tệp có sẵn trong HTTP Content-Length tiêu đề phản hồi. Nếu nó không có mặt, bạn không thể làm gì cả. Để tính%, chỉ cần thực hiện phép toán ở trường tiểu học như (part / total * 100).


3
2018-02-20 04:18





Ở đây mã đầy đủ để lấy chi tiết tệp trước khi tải xuống

require 'net/http'
response = nil
uri = URI('http://hero.com/abc.mp4')
Net::HTTP.start(uri.host, uri.port) do |http|
  response = http.head(uri)
end
response.header.each_header {|key,value| puts "#{key} = #{value}" } 

0
2017-09-09 11:48