2012-07-27 68 views
4

我試圖將圖像保存到Redis,Redis會在Resque任務中將其提取並上傳到我們的圖像服務器。無法在Redis中使用Rails中的redis gem正確保存圖像

ImageHandle類將爲我們獲取圖像。目前,我只關心如何獲取Redis中的圖像。

class ImageHandle < ActiveRecord::Base 
    attr_accessible :uploaded, :image 
    after_save :save_image 

    def image_data 
    $redis.get(redis_key) 
    end 

    def image=(value) 
    @image = value 
    end 

    private 

    def redis_key 
    @redis_key ||= "image_handle:#{id}:image" 
    end 

    def save_image 
    $redis.set(redis_key, @image.read) 
    end 
end 

其中$ redis的是在初始化設置:

$redis = Redis.new 

這是我的測試文件:

require 'test_helper' 

class ImageHandleTest < ActiveSupport::TestCase 
    include ActionDispatch::TestProcess 

    setup do 
    clear_redis 
    end 

    test 'saves an image' do  
    image = fixture_file_upload('screaming-eagle.jpg', 'image/jpg') 
    # You can only read from a file fixture once 
    same_image = fixture_file_upload('screaming-eagle.jpg', 'image/jpg') 

    image_handle = ImageHandle.create(image: image) 

    expected = same_image.read 
    actual = image_handle.image_data 

    puts "length of expected: #{expected.length}" 
    puts "length of actual: #{actual.length}" 

    assert_equal expected, actual 
    end 
end 

而且結果是:

length of expected: 81500 
length of actual: 78524 
F 

Finished tests in 0.270385s, 3.6984 tests/s, 3.6984 assertions/s. 

    1) Failure: 
test_saves_an_image:23 

我不知道發生了什麼事。

,當我試圖設置(「B」 * 81500),然後得到它,我把它背在81500.

感謝任何幫助,您可以給我預期的長。

回答

3

redis-rb將字符串轉換爲由Encoding::default_external(通常爲UTF-8)定義的默認外部編碼。見https://github.com/redis/redis-rb/commit/61fa1f884a643cd7dea8e0e56498860594058a39

您可以取回後它們存儲和解碼的Base64編碼之前的二進制數據爲Base64:

class ImageHandle < ActiveRecord::Base 
    attr_accessible :uploaded, :image 
    after_save :save_image 

    def image_data 
    Base64.decode $redis.get(redis_key) 
    end 

    def image=(value) 
    @image = value 
    end 

    private 

    def redis_key 
    @redis_key ||= "image_handle:#{id}:image" 
    end 

    def save_image 
    $redis.set redis_key, Base64.encode(@image.read) 
    end 
end 
0

您可以隱蔽的字符串爲ASCII-8BIT,而不會丟失數據。更新此方法:

def image_data 
    $redis.get(redis_key).force_encoding(Encoding::ASCII_8BIT) 
end 

它比Base64更快更簡單。

+0

適合我。沒有解釋的投票? – typeoneerror 2016-08-03 00:03:13

相關問題