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添加了一个条目,其中包含一些有关如何为所有版本化文件创建随机和唯一文件名的方法.
要拥有一个真正独特的文件名(几乎不是唯一的)我建议使用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)
| 归档时间: |
|
| 查看次数: |
22900 次 |
| 最近记录: |