2012-07-27 2 views
4

이미지를 Redis에 저장하려고합니다. 나중에 이미지를 가져 와서 Resque 작업에서 이미지 서버에 업로드합니다.Rails에서 redis gem을 사용하여 Redis에서 이미지를 올바르게 저장할 수 없습니다.

ImageHandle 클래스는 이미지를 가져옵니다. 지금은 레디스에서 이미지를 가져 오는 것에 만 관심이 있습니다.

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.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 

I 무슨 일이 벌어지고 있는지 전혀 몰라.

내가 ("B"* 81500)를 설정하고 그것을 점점 시도

, 내가 다시 당신이 내게 줄 수있는 어떤 도움 81500.

감사의 예상 길이를 얻었다.

답변

3

redis-rb는 문자열을 보통 UTF-8 인 Encoding::default_external으로 정의 된 기본 외부 인코딩으로 변환합니다. 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

당신은 데이터의 손실없이-8BIT을 아스키 문자열을 은밀한 할 수 있습니다. 이 방법 업데이트 :

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

Base64보다 빠르고 간단합니다.

+0

나를 위해 작동합니다. 아래 표에 대한 설명이 없습니까? – typeoneerror

관련 문제