Как 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 - это то, что требует наличия физического файла.
Ответы
Ответ 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 для вывода временных файлов. Существование файлов, созданных в этом каталоге, не гарантируется за пределами жизни одного запроса, но оно должно работать в ваших целях.
Надеюсь, это поможет, Дэвид