Как обработать сгенерированный объект Tempfile после загрузки URL-адреса open-uri? - PullRequest
0 голосов
/ 23 мая 2018

Я хочу выяснить, как загрузить изображения из Интернета, а затем сохранить их локально.Вот что я сделал:

require 'open-uri' # => true

file = open "https://s3-ap-southeast-1.amazonaws.com/xxx/Snip20180323_40.png"
# => #<Tempfile:/var/folders/k0/.../T/open-uri20180524-60756-1r44uix>

Тогда я был озадачен этим Tempfile объектом.Я обнаружил, что могу получить исходный URL:

file.base_uri
# => #<URI::HTTPS https://s3-ap-southeast-1.amazonaws.com/xxx/Snip20180323_40.png>

Но мне не удалось найти метод, который может напрямую получить исходное имя файла Snip20180323_40.png.

  1. Есть лиметод, который может напрямую получить исходное имя файла из Tempfile объекта?
  2. Для каких целей Tempfile объекты используются в основном?Отличаются ли они от обычных файловых объектов, таких как: file_object = File.open('how_old.rb') # => #<File:how_old.rb>?
  3. Могу ли я преобразовать объект Tempfile в File объект?
  4. Как можно записать это Tempfile какфайл с таким же именем в локальном каталоге, например /users/user_name/images/Snip20180323_40.png?

1 Ответ

0 голосов
/ 23 мая 2018
  1. Оригинальное имя файла действительно доступно только в URL.Просто возьмите uri.path.split("/").last.
  2. . Tempfiles являются эффективными файлами, с той разницей, что при сборке мусора основной файл удаляется.
  3. Вы можете скопировать базовый файл с помощью FileUtils.copy,или вы можете открыть Tempfile, прочитать его и записать в новый дескриптор файла по вашему выбору.
  4. Что-то вроде этого должно работать:

    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.Вышеупомянутое решение обрабатывает оба случая.Это также просто принимает, какой бы ни была последняя часть параметра пути - это будет зависеть от вас, чтобы очистить его, а также содержимое самого файла;в большинстве случаев вы не хотите разрешать клиентам загружать произвольные файлы в вашу систему.Например, вы можете быть уверены, что имя файла не содержит путей типа ..\\..\\..", которые могут использоваться для записи файлов в непредусмотренные места.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...