9

現在、OpenURI を使用して Ruby でファイルをダウンロードしています。残念ながら、完全なファイルをダウンロードせずに HTTP ヘッダーを取得することは不可能のようです。

open(base_url,
  :content_length_proc => lambda {|t|
    if t && 0 < t
      pbar = ProgressBar.create(:total => t)
  end
  },
  :progress_proc => lambda {|s|
    pbar.progress = s if pbar
  }) {|io|
    puts io.size
    puts io.meta['content-disposition']
  }

上記のコードを実行すると、最初に完全なファイルがダウンロードされてから、必要なヘッダーが出力されることがわかります。

ファイル全体がダウンロードされる前にヘッダーを取得する方法はありますか?ヘッダーが期待どおりでない場合は、ダウンロードをキャンセルできますか?

4

3 に答える 3

11

この件については、Net::HTTP を使用できます。たとえば、次のようになります。

require 'net/http'

http = Net::HTTP.start('stackoverflow.com')

resp = http.head('/')
resp.each { |k, v| puts "#{k}: #{v}" }
http.finish

別の例として、今回はすばらしい本Object Orient Programming With ANSI-Cのヘッダーを取得します。

require 'net/http'

http = Net::HTTP.start('www.planetpdf.com')

resp = http.head('/codecuts/pdfs/ooc.pdf')
resp.each { |k, v| puts "#{k}: #{v}" }
http.finish
于 2013-07-03T18:47:27.263 に答える
5

私が望んでいたことは、少なくとも私が言ったように、最初にファイル全体をロードしない限り、OpenURI を使用してアーカイブすることはできないようです。

Net::HTTP を使用して、やりたいことを行うことができましたrequest_get

ここに例があります:

http.request_get('/largefile.jpg') {|response|
  if (response['content-length'] < max_length)
    response.read_body do |str|   # read body now
      # save to file
    end
  end
}

これは、ブロックを使用している場合にのみ機能することに注意してください。

response = http.request_get('/largefile.jpg')

本文はすでに読み取られます。

于 2013-07-15T23:04:36.703 に答える