Rails carrierwave custom name

niedhui · 2012年01月17日 · 最后由 niedhui 回复于 2012年02月04日 · 4161 次阅读

我们现在在用 carrierwave 来处理图片上传,想像 ruby-china 这样处理文件名,

def filename
  if super.present?
    ext = File.extname(original_filename)
    fname = Digest::MD5.hexdigest(self.read)
    @name ||= "#{fname}#{ext}" 
  end
end

这部分代码我是写在一个 BaseUploader 里面的,这样所有的图片处理都用这个逻辑了。 但是我们有用到

version :thumb do
  process :resize_to_fill => [48,48]
end

这样的问题是 假如有一个图片的原始内容的 md5 是 111111111111,resize 后的内容的 md5 是 22222222, 会导致: model.avatar.url ===> /xxx/xxxx/111111111111.jpg model.avatar.thumb.url =====> /xxx/xxxx/thumb_111111111111.jpg 而实际上: model.avatar.url ===> /xxx/xxxx/111111111111.jpg model.avatar.thumb.url =====> /xxx/xxxx/thumb_22222222.jpg

有什么办法解决,难道要在 model 加变量来处理?

没有很看懂你的问题出在什么地方。CarrierWave 的所有图片都是根据原图的定的。 相应地,要做如下事情:

  1. Override "filename" method def filename "#{secure_token(20)}.#{file.extension}" if original_filename end

  2. Add "secure_token" method def secure_token(length = 16) var = :"@#{mounted_as}_secure_token" model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(length / 2)) end

#1 楼 @sunzheng91 谢谢 因为 fname = Digest::MD5.hexdigest(self.read) 所以当处理 version 的 name 的时候,self.read 读的是处理过的文件

def secure_token(length = 16) 
  var = :"@#{mounted_as}_secure_token" 
  model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(length / 2)) 
end

这个就是我最后问的 难道要在 model 加变量来处理?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号