2013-10-16 104 views
2

預壓縮的數據假設爲存儲效率您使用的zlib壓縮您不常訪問數據庫中的數據,以及一個人在使用瀏覽器請求某些數據。如何才能提供這些數據?渲染的Zlib和Rails

這裏有我想要的東西,但不現實簡單的例子:

require "zlib" 

class SomeController < ApplicationController 

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

這符合壓縮數據到客戶端的瀏覽器,但是對於正常觀看不會解壓縮。有沒有辦法讓客戶以未壓縮(膨脹)狀態下接收到該信息,使這項工作。問題的關鍵是,我不想在控制器膨脹,只是使用Rack::Deflater再次縮小。我想避免不必要的cpu​​使用/時間消耗,同時降低存儲和帶寬使用量。

回答

1

爲了使這成爲可能,您首先需要將Content-Encoding標頭設置爲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訪問您可以使用的包裝。