Я использую следующую функцию на Ruby для загрузки различных файлов через HTTP:Как загрузить задержанный файл через HTTP в Ruby?
def http_download(uri, filename)
bytes_total = nil
begin
uri.open(
read_timeout: 500,
content_length_proc: lambda { |content_length|
bytes_total = content_length
},
progress_proc: lambda { |bytes_transferred|
if bytes_total
print("\r#{bytes_transferred} of #{bytes_total} bytes")
else
print("\r#{bytes_transferred} bytes (total size unknown)")
end
}
) do |file|
open filename, 'w' do |io|
file.each_line do |line|
io.write line
end
end
end
rescue => e
puts e
end
end
Я также хочу, чтобы загрузить файлы (csv, kml, zip, geojson) от this website. Однако есть какая-то задержка настроена. Когда я нажимаю ссылку загрузки в браузере, она занимает немного, пока не появится окно загрузки. Я полагаю, что файл должен быть обработан на сервере, прежде чем он сможет обслуживаться.
Как я могу изменить свой сценарий, чтобы учесть задержку?
Я бегу Ruby 2.2.2.
Привет, что ваша версия Ruby? Я запускаю ваш код с помощью Ruby 2.2.2, получил исключение из «private method» open «called». И я открыл веб-сайт, кнопка «Загрузить набор данных», которую вы нажимаете? Я не столкнулся с ** задержкой **, которую вы упомянули, это только URL-адрес веб-сайта, который добавляет '.csv',' .kml', '.zip' и несколько параметров запроса. – ifyouseewendy
Да, последняя версия. Да, ссылки скрыты под кнопкой «Загрузить набор данных». Может быть, они теперь задерживают его на сервере, когда я его нажал. Возможно, попробуйте другой набор данных. – JJD
Я обнаружил, что для набора данных при первом запросе он возвращает JSON, который представляет статус, например. '{status:" processing ", processing_time: 0, count: 0}', '{status:" processing ", processing_time: 9.58, count: 0}'. После обработки вы загрузите файл. Поэтому я думаю, что вы можете просто добавить судью и повторить попытку обработки. – ifyouseewendy