- Оригинальное имя файла действительно доступно только в URL.Просто возьмите
uri.path.split("/").last
. - . Tempfiles являются эффективными файлами, с той разницей, что при сборке мусора основной файл удаляется.
- Вы можете скопировать базовый файл с помощью
FileUtils.copy
,или вы можете открыть Tempfile, прочитать его и записать в новый дескриптор файла по вашему выбору. Что-то вроде этого должно работать:
def download_url_to(url, base_path)
uri = URI(url)
filename = uri.path.split("/").last
new_file = File.join(base_path, filename)
response = uri.open
open(new_file, "wb") {|fp| fp.puts response.read }
return new_file
end
Стоит отметить, что если размер файла менее 10 КБ, вы получите объект StringIO, а не объект Tempfile.Вышеупомянутое решение обрабатывает оба случая.Это также просто принимает, какой бы ни была последняя часть параметра пути - это будет зависеть от вас, чтобы очистить его, а также содержимое самого файла;в большинстве случаев вы не хотите разрешать клиентам загружать произвольные файлы в вашу систему.Например, вы можете быть уверены, что имя файла не содержит путей типа ..\\..\\.."
, которые могут использоваться для записи файлов в непредусмотренные места.