gpt4 book ai didi

ruby-on-rails - rails : on-the-fly streaming of output in zip format?

转载 作者:行者123 更新时间:2023-12-03 14:54:45 24 4
gpt4 key购买 nike

我需要在一个 zip 文件中从我的数据库中提供一些数据,即时流式传输它,以便:

  • 我没有将临时文件写入磁盘
  • 我没有在 RAM 中编写整个文件

  • 我知道我可以使用 ZipOutputStream 将 zip 文件流式生成到文件系统k如 here .我也知道我可以通过设置 response_body 从 rails Controller 进行流输出到 Prochere .我需要(我认为)是一种将这两件事结合在一起的方法。我可以让 rails 提供来自 ZipOutputStream 的响应吗? ?我可以得到 ZipOutputStream给我增量的数据块,我可以将它们输入到我的 response_bodyProc ?或者还有其他方法吗?

    最佳答案

    精简版
    https://github.com/fringd/zipline
    长版
    所以 jo5h 的回答在 Rails 3.1.1 中对我不起作用
    不过,我发现了一个有帮助的 YouTube 视频。
    http://www.youtube.com/watch?v=K0XvnspdPsc
    它的关键是创建一个响应每个对象的对象......这就是我所做的:

      class ZipGenerator                                                                    
    def initialize(model)
    @model = model
    end

    def each( &block )
    output = Object.new
    output.define_singleton_method :tell, Proc.new { 0 }
    output.define_singleton_method :pos=, Proc.new { |x| 0 }
    output.define_singleton_method :<<, Proc.new { |x| block.call(x) }
    output.define_singleton_method :close, Proc.new { nil }
    Zip::IoZip.open(output) do |zip|
    @model.attachments.all.each do |attachment|
    zip.put_next_entry "#{attachment.name}.pdf"
    file = attachment.file.file.send :file
    file = File.open(file) if file.is_a? String
    while buffer = file.read(2048)
    zip << buffer
    end
    end
    end
    sleep 10
    end

    end

    def getzip
    self.response_body = ZipGenerator.new(@model)

    #this is a hack to preven middleware from buffering
    headers['Last-Modified'] = Time.now.to_s
    end
    编辑:
    上述解决方案实际上并没有奏效......问题是rubyzip需要在文件周围跳转以重写条目的标题。特别是它需要在写入数据之前写入压缩大小。这在真正的流媒体情况下是不可能的......所以最终这个任务可能是不可能的。有可能一次缓冲整个文件,但这似乎不太值得。最终我只是写了一个 tmp 文件......在 heroku 上我可以写到 Rails.root/tmp 较少的即时反馈,并不理想,但必要。
    另一个编辑:
    我最近有了另一个想法......如果我们不压缩它们,我们可以知道文件的压缩大小。计划是这样的:
    子类 ZipStreamOutput 类如下:
  • 始终使用“存储”压缩方法,即不压缩
  • 确保我们永远不会向后寻求更改文件头,提前做好准备
  • 重写任何与寻找
  • 的 TOC 相关的代码

    我还没有尝试实现这一点,但如果有任何成功,我会报告。
    确定最后一次编辑:
    在 zip 标准中: http://en.wikipedia.org/wiki/Zip_(file_format)#File_headers
    他们提到你可以翻转一些文件来放置文件后的大小、压缩大小和 crc。所以我的新计划是对 zipoutput 流进行子类化,以便它
  • 设置此标志
  • 在数据之后写入大小和 CRC
  • 从不倒带输出

  • 此外,我需要获得所有的技巧,以便在固定的 rails 中流式传输输出......
    反正这一切都奏效了!
    这里有一颗 gem !
    https://github.com/fringd/zipline

    关于ruby-on-rails - rails : on-the-fly streaming of output in zip format?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4797315/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com