Ruby将String转换为File以上传到FTP

时间:2015-01-21 17:33:43

标签: ruby csv ftp stringio

目前我们有一个方法可以返回带有格式化CSV文件的字符串。

string   = EXPORT.tickets

我们需要将此csv文件上传到ftp服务器,如此

ftp = Net::FTP.new(server, username, password)
ftp.putbinaryfile(string)

但是,string变量显然是一个字符串,而不是putbinaryfile方法所期望的二进制文件。我认为有两种方法可以做到这一点,

  1. 首先使用string
  2. File变量转换为文件
  3. 将字符串直接转换为类似StringIO
  4. 的文件

    这些似乎是可行的选择吗?如果是这样,我将如何做到这一点,提前谢谢!

    编辑:

    由于putbinaryfile方法正在寻找文件路径而不是实际文件,因此看起来我最好的方法是从string变量创建一个文件。任何人都可以举例说明如何实现这一目标吗?

2 个答案:

答案 0 :(得分:3)

这样的事情应涵盖大部分基础:

require 'tempfile'

temp_file = Tempfile.new('for_you')
temp_file.write(string)
temp_file.close

ftp.putbinaryfile(temp_file)

temp_file.unlink

使用Tempfile可以解决许多有关唯一文件名,线程安全性等问题。垃圾收集将确保您的文件被删除,即使putbinaryfile引发异常或类似的危险。

上传的文件将在本地和远程服务器上获得for_you.23423423.423.423.4这样的名称。如果您希望它在远程服务器上具有特定名称,例如'daily_log_upload',请执行以下操作:

ftp.putbinaryfile(temp_file, 'daily_log_upload')

它仍然具有本地临时文件的唯一名称,但您不关心它。

答案 1 :(得分:2)

在与另一位开发人员交谈后,他给了我这个解决方案,我认为这对我的情况更好,因为该文件已经不存在了。它会跳过将字符串写入Tempfile并使用StringIO直接上传它。他的解决方案:

Net :: FTP#putbinaryfile方法将本地文件系统上的文件的名称复制到远程文件系统。现在,如果您的数据是字符串(并且没有从文件系统上的文件中读取),那么您可能希望使用Net :: FTP#storbinary:

require 'stringio'
require 'net/ftp'

BLOCKSIZE = 512 
data      = StringIO.new("Hello, world!\n")
hostname  = "ftp.domain.tld"
username  = "username"
password  = "password"

remote_filename = "something.txt"

Net::FTP.open(hostname, username, password) do |ftp|
  # ...other ftp commands here...
  ftp.storbinary("STOR #{remote_filename}", data, BLOCKSIZE)
  # ...any other ftp commands...
end

以上内容避免了将不在磁盘上的数据写入磁盘,只是为了将其上传到某处。但是,如果数据已经存在于磁盘上的文件中,您可以修改代码以引用其文件名。