【问题标题】:How do i GZIP static resources using zlib?我如何使用 zlib GZIP 静态资源?
【发布时间】:2012-06-10 09:17:41
【问题描述】:

编辑:我将 Ruby 与 Sinatra 一起使用。

更新:这是我正在使用的代码,它不起作用...

get '/' do
    session[:time] = Time.now
    z = Zlib::Deflate.new(6, 31)
    z.deflate(File.read('public/Assets/Styles/build.css'))
    z.flush
    z.finish
    z.close
    erb :home
end

...我没有收到任何错误。但是当我通过 Firebug 的 Yslow 插件检查文件时,它告诉我该文件不是 GZIP 文件

我试图了解我如何使用zlib GZIP 网页内容和静态文件(如 JavaScript 和 CSS)?

我知道我可以将一串数据传递给Zlib::Deflate.deflate,但我正在将 Sinatra 与 ERB 文件一起使用。那么我是否传递 ERB 文件和 Js/CSS 文件的路径?或者我可以传入存储脚本/样式的目录吗?我会传入 ERB 文件的路径还是引用 ERB 文件的符号?

【问题讨论】:

    标签: ruby sinatra gzip zlib


    【解决方案1】:

    除非您正在编写自己的 HTTP 服务器,否则您的服务器需要处理这个问题。客户端首先要让服务器知道它接受 gzip 内容编码,然后服务器才能传递 gzip 内容编码。

    Zlib::Deflate.deflate 不会产生 gzip 编码的数据。它只会产生 zlib 编码的数据。您需要使用 Zlib::Deflate.new 和 windowBits 参数等于 31 来启动 gzip 流。

    【讨论】:

    • 好的,所以我应该使用z = Zlib::Deflate.new(1, 31),然后我可以使用z.deflate(File.read("path/to/file")),这样对吗?请注意,文档并不清楚“级别”参数的限制,所以我指定了 1 但不知道我正在处理的范围是多少?
    • 是的。范围是 1 到 9,其中 6 是默认值。仅当您遇到吞吐量问题并且需要以较低压缩率(值小于 6)为代价而需要更高速度时,或者如果您不关心速度并希望获得最后一点压缩时,您才应该使用 6 以外的其他值(值大于 9)。您还需要关闭 deflate 流,以确保它压缩了它获得的最后一位。
    • @mark-adlert 你好,这对我不起作用。我已经更新了我的问题(见上文)以显示我现在使用的代码,但这似乎对 GZIP 文件的内容不起作用?
    • 这不起作用(请参阅我更新的问题以获取最新代码) - 你会看到我正在使用 flushfinishclose
    • 那么您希望从哪里获得结果? z.deflate(...), result = z.finish 或 result = z.deflate(..., Zlib::FINISH) 会将 gzip 流放入 result 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 2013-05-05
    • 2010-12-22
    • 1970-01-01
    • 2012-11-30
    • 2022-12-04
    相关资源
    最近更新 更多