Получить имя файла на сервере при использовании Ruby gem Curb

Есть ли способ получить имя загружаемого файла (без анализа предоставленного URL-адреса)? Я надеюсь найти что-то вроде:

c = Curl::Easy.new("http://google.com/robots.txt")
c.perform
File.open( c.file_name, "w") { |file| file.write c.body_str }

person Jikku Jose    schedule 20.02.2014    source источник


Ответы (1)


К сожалению, в документации 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 для разбора универсальных ресурсов — в конце концов, для этого она и была создана.

person zeantsoi    schedule 20.02.2014
comment
Может быть, лучше извлечь путь вот так url.split("/").last. Но, спрашивая, так как предположил, что я просто упускаю что-то очень очевидное, видя объем опций, доступных для Curb. - person Jikku Jose; 20.02.2014
comment
@JikkuJose — К сожалению, Curb неожиданно не предоставляет такой функциональности. Однако, что касается использования split(), я обновил свой ответ, объяснив, почему его не следует считать универсальным решением. Если этот ответ удовлетворяет ваш вопрос, не могли бы вы принять его как правильный? - person zeantsoi; 20.02.2014
comment
Конечно! Ваш ответ, безусловно, более общий и поможет большинству, кто может наткнуться на это. - person Jikku Jose; 20.02.2014