Как FTP в Ruby без предварительного сохранения текстового файла - PullRequest
12 голосов
/ 07 марта 2011

Поскольку Heroku не позволяет сохранять динамические файлы на диск, я столкнулся с дилеммой, которую, надеюсь, вы поможете мне преодолеть. У меня есть текстовый файл, который я могу создать в оперативной памяти. Проблема в том, что я не могу найти гем или функцию, которая позволила бы мне передавать файл на другой FTP-сервер. Используемый мной гем Net / FTP требует, чтобы я сначала сохранил файл на диск. Есть предложения?

ftp = Net::FTP.new(domain)
ftp.passive = true
ftp.login(username, password)
ftp.chdir(path_on_server)
ftp.puttextfile(path_to_web_file)
ftp.close

Функция ftp.puttextfile - это то, что требует наличия физического файла.

Ответы [ 2 ]

19 голосов
/ 29 сентября 2011

StringIO.new предоставляет объект, который действует как открытый файл.Создать метод наподобие puttextfile легко, используя объект StringIO вместо файла.

require 'net/ftp'
require 'stringio'

class Net::FTP
  def puttextcontent(content, remotefile, &block)
    f = StringIO.new(content)
    begin
      storlines("STOR " + remotefile, f, &block)
    ensure
      f.close
    end
  end
end

file_content = <<filecontent
<html>
  <head><title>Hello!</title></head>
  <body>Hello.</body>
</html>
filecontent

ftp = Net::FTP.new(domain)
ftp.passive = true
ftp.login(username, password)
ftp.chdir(path_on_server)
ftp.puttextcontent(file_content, path_to_web_file)
ftp.close
5 голосов
/ 07 марта 2011

Дэвид из Heroku быстро ответил на запрос в службу поддержки, который я там ввел.

Вы можете использовать APP_ROOT / tmp для вывода временных файлов.Существование файлов, созданных в этом каталоге, не гарантируется вне срока действия одного запроса, но оно должно работать для ваших целей.

Надеюсь, это поможет, Дэвид

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