如何在 Ruby 中进行 FTP 而不先保存文本文件

发布于 2024-10-20 23:57:58 字数 360 浏览 2 评论 0原文

由于 Heroku 不允许将动态文件保存到磁盘,我遇到了一个困境,我希望你能帮助我克服。我有一个可以在 RAM 中创建的文本文件。问题是我找不到允许我将文件流式传输到另一个 FTP 服务器的 gem 或函数。我正在使用的 Net/FTP gem 要求我首先将文件保存到磁盘。有什么建议吗?

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 函数要求物理文件存在。

Since Heroku does not allow saving dynamic files to disk, I've run into a dilemma that I am hoping you can help me overcome. I have a text file that I can create in RAM. The problem is that I cannot find a gem or function that would allow me to stream the file to another FTP server. The Net/FTP gem I am using requires that I save the file to disk first. Any suggestions?

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

The ftp.puttextfile function is what is requiring a physical file to exist.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

潦草背影 2024-10-27 23:57:58

StringIO.new 提供了一个行为类似于的对象一个打开的文件。创建像 puttextfile< 这样的方法很容易/a>,使用 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

StringIO.new provides an object that acts like an opened file. It's easy to create a method like puttextfile, by using StringIO object instead of file.

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
春风十里 2024-10-27 23:57:58

Heroku 的 David 对我在那里输入的支持票证做出了迅速回复。

您可以使用 APP_ROOT/tmp 进行临时文件输出。在单个请求的生命周期之外,不能保证在此目录中创建的文件的存在,但它应该可以满足您的目的。

希望这有帮助,
大卫

David at Heroku gave a prompt response to a support ticket I entered there.

You can use APP_ROOT/tmp for temporary file output. The existence of files created in this dir is not guaranteed outside the life of a single request, but it should work for your purposes.

Hope this helps,
David

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文