次の Ruby スクリプトを使用して、HTTP 経由でバイナリ ファイルをダウンロードしようとしています。
#!/usr/bin/env ruby
require 'net/http'
require 'uri'
def http_download(resource, filename, debug = false)
uri = URI.parse(resource)
puts "Starting HTTP download for: #{uri}"
http_object = Net::HTTP.new(uri.host, uri.port)
http_object.use_ssl = true if uri.scheme == 'https'
begin
http_object.start do |http|
request = Net::HTTP::Get.new uri.request_uri
Net::HTTP.get_print(uri) if debug
http.read_timeout = 500
http.request request do |response|
open filename, 'w' do |io|
response.read_body do |chunk|
io.write chunk
end
end
end
end
rescue Exception => e
puts "=> Exception: '#{e}'. Skipping download."
return
end
puts "Stored download as #{filename}."
end
ただし、バイナリではなく HTML ソースをダウンロードします。ブラウザに URL を入力すると、バイナリ ファイルがダウンロードされます。スクリプトが失敗する URL は次のとおりです。
http://dcatlas.dcgis.dc.gov/catalog/download.asp?downloadID=2175&downloadTYPE=KML
次のようにスクリプトを実行します
pry> require 'myscript'
pry> resource = "http://dcatlas.dcgis.dc.gov/catalog/download.asp?downloadID=2175&downloadTYPE=KML"
pry> http_download(resource,"StreetTreePt.KML", true)
どうすればバイナリをダウンロードできますか?
リダイレクト実験
私はこのリダイレクトチェックを見つけましたが、これはかなり合理的に見えます。応答ブロックに統合すると、次のエラーで失敗します。
Exception: 'undefined method `host' for "save_download.asp?filename=StreetTreePt.KML":String'. Skipping download.
上記の「元の」関数では例外は発生しません。