Подтвердить что ты не робот

Как FTP в Ruby без предварительного сохранения текстового файла

Поскольку 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 - это то, что требует наличия физического файла.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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