Ruby将字符串转换为文件以上载到FTP

Ruby将字符串转换为文件以上载到FTP,ruby,csv,ftp,stringio,Ruby,Csv,Ftp,Stringio,目前,我们有一个方法返回一个带有格式化CSV文件的字符串 string = EXPORT.tickets 我们需要像这样将这个csv文件上传到ftp服务器 ftp = Net::FTP.new(server, username, password) ftp.putbinaryfile(string) 但是,string变量显然是一个字符串,而不是putbinaryfile方法所期望的二进制文件。我认为有两种方法可以做到这一点 首先使用file 将字符串直接转换为类似于StringIO 这

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

string   = EXPORT.tickets
我们需要像这样将这个csv文件上传到ftp服务器

ftp = Net::FTP.new(server, username, password)
ftp.putbinaryfile(string)
但是,
string
变量显然是一个字符串,而不是putbinaryfile方法所期望的二进制文件。我认为有两种方法可以做到这一点

  • 首先使用
    file
  • 将字符串直接转换为类似于
    StringIO
  • 这些似乎是可行的选择吗?如果是这样的话,我会怎么做,提前谢谢

    编辑:


    由于putbinaryfile方法查找的是文件路径,而不是实际的文件,因此我的最佳选择似乎是从
    字符串
    变量创建一个文件。有谁能举例说明如何做到这一点吗?

    类似的内容应该涵盖大部分基础:

    require 'tempfile'
    
    temp_file = Tempfile.new('for_you')
    temp_file.write(string)
    temp_file.close
    
    ftp.putbinaryfile(temp_file)
    
    temp_file.unlink
    
    使用Tempfile可以避免许多关于唯一文件名、线程安全性等的问题。垃圾收集将确保文件被删除,即使putbinaryfile引发异常或类似的危险

    上载的文件将在本地和远程服务器上为您获得类似于
    的名称。2342423.423.4
    。如果您希望它在远程服务器上有一个特定的名称,如“daily_log_upload”,请执行以下操作:

    ftp.putbinaryfile(temp_file, 'daily_log_upload')
    

    对于本地临时文件,它仍然有一个唯一的名称,但您不关心这个问题。

    在与另一位开发人员交谈后,他给了我这个解决方案,我发现它更适合我的情况,因为该文件还不存在。它跳过将字符串写入临时文件,并使用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
    

    上述方法避免了将不在磁盘上的数据写入磁盘,只是为了将其上传到某个地方。但是,如果数据已经在磁盘上的一个文件中,您也可以将代码改为引用其文件名。

    这不是100%,
    putbinaryfile
    需要二进制文件的路径(可能是字符串)。我可能会先创建一个文件(请参阅),然后上传它。上传后不要忘记删除文件:)你是正确的,它正在寻找路径。你觉得我使用Ruby Tempfile类怎么样?听起来不错!还有一件事:我想你可以使用
    puttextfile
    而不是
    putbinaryfile
    ,因为CSV只是文本,但一定要先测试一下……好的,谢谢,我编辑了我的问题。基本上,我从一开始就很难将字符串放入实际的文件中,所以如果你有任何想法,请随意发布一个答案:)我相信你的意思是
    ftp.putbinaryfile(temp_file.path)
    ,对吗?我尝试了这两种方法,但都有效-因此它显然知道如何检查它是否是文件对象,谢谢你的回答,我也喜欢Tempfile解决方案,而不是问题的答案。。这将保存该文件。。不管是不是Temp,它都会写入磁盘。很好!这是对Tempfile的改进。