gpt4 book ai didi

ruby-on-rails - 使用 Zlib 和 Rails 呈现预压缩数据

转载 作者:行者123 更新时间:2023-12-04 06:28:15 28 4
gpt4 key购买 nike

假设为了提高存储效率,您使用 Zlib 压缩了不常访问的数据库数据,并且有人使用浏览器请求其中的一些数据。如何处理这些数据?

这是我想要的一个不切实际但直截了当的例子:

require "zlib"

class SomeController < ApplicationController

def index
compressed_data = Zlib::Deflate.deflate("Some precompressed database data.")
render :text => compressed_data
end
end

这将压缩数据提供给客户端的浏览器,但不会解压缩以供正确查看。有没有办法使这项工作使客户端以未压缩(膨胀)状态接收此数据。关键是我不想在 Controller 中充气,只是想使用 Rack::Deflater 再次放气。我想避免不必要的 CPU 使用率/时间消耗,同时降低存储和带宽使用率。

最佳答案

为了使这成为可能,您首先需要将 Content-Encoding header 设置为 gzip。而不是使用 Zlib::Deflate.deflate 你会想要创建一个新的 StringIO 缓冲区对象,将它传递给 Zlib::GzipWriter 对象,并通过它写入 StringIO 缓冲区对象。完成后,关闭 Zlib::GzipWriter 对象。最后,渲染出缓冲区的字符串。

例如:

require "zlib"
require "stringio"

class SomeController < ApplicationController

def index
response.headers["Content-Encoding"] = "gzip"

buffer = StringIO.new

gz = Zlib::GzipWriter.new(buffer, Zlib::DEFAULT_COMPRESSION, Zlib::DEFAULT_STRATEGY)
gz.write("Some precompressed database data.")
gz.close

render :text => buffer.string
end
end

或者,ActiveSupport::Gzip 显然有一个内置的类方法,它允许您用更少的代码完成同样的事情。

class SomeController < ApplicationController

def index
response.headers["Content-Encoding"] = "gzip"

string = ActiveSupport::Gzip.compress("Some precompressed database data.")

render :text => string
end
end

后一个示例将在 Rails 环境或其他包含 ActiveSupport 框架的环境中工作,并且基本上是前一个示例的包装器,如果您无权访问,则可以使用它ActiveSupport::Gzip

关于ruby-on-rails - 使用 Zlib 和 Rails 呈现预压缩数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19409388/

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