Есть ли способ получить имя загружаемого файла (без анализа предоставленного URL-адреса)? Я надеюсь найти что-то вроде:
c = Curl::Easy.new("http://google.com/robots.txt")
c.perform
File.open( c.file_name, "w") { |file| file.write c.body_str }
Есть ли способ получить имя загружаемого файла (без анализа предоставленного URL-адреса)? Я надеюсь найти что-то вроде:
c = Curl::Easy.new("http://google.com/robots.txt")
c.perform
File.open( c.file_name, "w") { |file| file.write c.body_str }
К сожалению, в документации Curb ничего не говорится об опросе имени файла. Я не знаю, есть ли у вас особое отвращение к синтаксическому анализу, но это простой процесс, если вы используете URI
модуль:
require 'uri'
url = 'http://google.com/robots.txt'
uri = URI.parse(url)
puts File.basename(uri.path)
#=> "robots.txt"
ОБНОВЛЕНИЕ:
В комментариях к этому вопросу ОП предлагает использовать split()
, чтобы разделить URL-адрес косой чертой (/
). Хотя это может работать в большинстве ситуаций, это не универсальное решение. Например, файлы с версиями не будут правильно проанализированы:
url = 'http://google.com/robots.txt?1234567890'
puts url.split('/').last
#=> "robots.txt?1234567890"
Для сравнения, используя URI .parse() гарантирует, что будет возвращено имя файла — и только имя файла:
require 'uri'
url = 'http://google.com/robots.txt?1234567890'
uri = URI.parse(url)
puts File.basename(uri.path)
#=> "robots.txt"
В общем, для оптимальной согласованности и целостности разумно использовать библиотеку URI
для разбора универсальных ресурсов — в конце концов, для этого она и была создана.
url.split("/").last
. Но, спрашивая, так как предположил, что я просто упускаю что-то очень очевидное, видя объем опций, доступных для Curb.
- person Jikku Jose; 20.02.2014
split()
, я обновил свой ответ, объяснив, почему его не следует считать универсальным решением. Если этот ответ удовлетворяет ваш вопрос, не могли бы вы принять его как правильный?
- person zeantsoi; 20.02.2014