加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 无法使用Rails中的redis gem在Redis中正确保存

发布时间:2020-12-17 02:18:29 所属栏目:百科 来源:网络整理
导读:我正在尝试将图像保存到Redis,稍后将在Resque任务中将其提取并上传到我们的图像服务器. ImageHandle类将为我们提取图像.就目前而言,我只关心将图像输入和输出Redis. class ImageHandle ActiveRecord::Base attr_accessible :uploaded,:image after_save :sav
我正在尝试将图像保存到Redis,稍后将在Resque任务中将其提取并上传到我们的图像服务器.

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

感谢你给与我的帮助.

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读