使用Carrierwave重命名上传的文件

wav*_*ing 30 ruby file-upload ruby-on-rails carrierwave

我正在使用Carrierwave上传文件,我有它的工作.

我的问题是尝试更改上传文件的名称.

在生成的uploader.rb中有一个我认为我应该使用的方法

def filename
   "something.jpg" if original_filename
   basename = "what"+orginal_filename if original_filename, works
   basename = (0...8).map{65.+(rand(25)).chr}.join if original_filename  # will create a random name for each version, e.g. the orginal, the thumb, and the filename in the db, useless
 end
Run Code Online (Sandbox Code Playgroud)

我似乎无法访问sanitized_file.rb中的'extension'或'content_type'之类的项目,因此这有点超出我目前的技能水平.

这样做的任何建议或练习,即为上传的文件生成文件名,该文件与carrierwave默认值一样(什么都不做,但是会继续执行每个版本)?看起来它应该很简单,但我偶然发现了这一点.

Jac*_*Chu 34

那么,随机文件名生成器的另一个问题是它可能发生冲突不是吗?您可能会生成已生成的文件名.一种方法是以某种方式基于图像的唯一属性(如文件路径)生成哈希.来自carrierwave 集团的一个例子:

def filename 
  if original_filename 
    @name ||= Digest::MD5.hexdigest(File.dirname(current_path))
    "#{@name}.#{file.extension}"
  end
end
Run Code Online (Sandbox Code Playgroud)

这将基于当前路径创建MD5哈希,然后将原始文件的扩展名附加到其上.

编辑: carrierwave wiki添加了一个条目,其中包含一些有关如何为所有版本化文件创建随机和唯一文件名的方法.

  • 假设有一个rake任务进入并删除了临时文件,那么使用File.dirname(current_path)的碰撞概率是不是很高?我认为更好的解决方案可能是将created_at与路径结合使用. (2认同)

ram*_*igg 5

要拥有一个真正独特的文件名(几乎不是唯一的)我建议使用uuid gem.

在Gemfile中添加:

gem 'uuid'
Run Code Online (Sandbox Code Playgroud)

在file_uploader.rb中:

def filename
  if original_filename
    if model && model.read_attribute(mounted_as).present?
      model.read_attribute(mounted_as)
    else
      @name ||= "#{mounted_as}-#{uuid}.#{file.extension}"
    end
  end
end

protected

def uuid
  UUID.state_file = false
  uuid = UUID.new
  uuid.generate
end
Run Code Online (Sandbox Code Playgroud)