gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:42:31 25 4
gpt4 key购买 nike

我需要在一个 zip 文件中提供来 self 的数据库的一些数据,动态地传输它,这样:

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

我知道我可以使用 ZipOutputStream 作为 here 将 zip 文件生成流式传输到文件系统k .我也知道我可以通过将 response_body 设置为 Proc 作为 here 来从 Rails Controller 进行流输出.我需要的(我认为)是一种将这两件事结合在一起的方法。我可以让 Rails 提供来自 ZipOutputStream 的响应吗?我可以让 ZipOutputStream 给我增量数据 block ,我可以将这些数据 block 输入到我的 response_body Proc 中吗?还是有别的办法?

最佳答案

精简版

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

编辑:

上面的解决方案实际上并没有起作用...问题是 ruby​​zip 需要在文件中跳来跳去以重写条目的标题。特别是它需要在写入数据之前写入压缩大小。这在真正的流媒体情况下是不可能的……所以最终这个任务可能是不可能的。有可能一次缓冲整个文件,但这似乎不太值得。最终我只是写了一个 tmp 文件...在 heroku 上我可以写到 Rails.root/tmp 更少的即时反馈,虽然不理想,但有必要。

另一个编辑:

我最近有了另一个想法...如果我们不压缩文件,我们可以知道文件的压缩大小。计划是这样的:

子类化 ZipStreamOutput 类如下:

  • 始终使用“存储”压缩方法,即不压缩
  • 确保我们永远不会向后寻求更改文件头,提前做好一切
  • 重写任何与寻求目录相关的代码

我还没有尝试实现这个,但如果有任何成功,我会报告。

确定最后一次编辑:

在 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/42468825/

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