首页 > 代码库 > 使用CarrierWave上传图片时,多版本文件名的统一
使用CarrierWave上传图片时,多版本文件名的统一
第一次使用CarrierWavewe做上传,不能不说,虽然Rails已经把上传变得超简单了,而CarrierWave则是把上传变成了一种享受,特别是做图片上传,现在这年代,图片展示平台已经不仅仅是电脑了,各移动端也是必须要兼顾的,这导致了上传的图片,一般都需要有好几个版本大小,如果还纯手工的使用RMagick之类慢慢处理的话,实在是有点郁闷,而CarrierWave配上MiniMagick,一个version搞定一切,真的是感觉“倍儿爽”。
不过在使用过程中,也发现了几个小问题,最主要的就是,就是当存在多个图片大小版本时,生成的文件名不一致的情况。CarrierWave本身生成文件名是使用时间戳的,但是当存在多个版本时,第一个版本,它都会启动一个新实例,这导致生成的文件名,时间上会不一样,也就导致了了最终的文件名不一样。
网上搜索了一下,比较好和方便的是大牛李华顺的方法,利用临时文件路径中的时间戳来做MD5,得到一致的文件名。不过我这次要求的文件名格式不一样,要求如下:
用户ID_时间_随机数.后缀
经过多次尝试,用了一个不怎么漂亮的方式实现了
class ShopImgUploader < CarrierWave::Uploader::Base include CarrierWave::MiniMagick process :resize_to_fit =>[500,500] version :thumb do process :resize_to_fill => [200,200] end #关键,添加一个方法,直接设置文件名 #我这里的p就是用户ID,而加上name是因为每个新的version都会启动一个新实例 #新实例中,是没有@name的,所以我们在生成文件名的时候,强制调用一下 def set_prefix p,name=nil @prefix = p if name.nil? @name = "#{@prefix}_#{Time.now.strftime ‘%Y%m%d%H%M%S%L‘}_#{rand(1..100)}" else @name = name end end #生成文件名规则 def filename #只有原始文件实例的时候@versions才不为空,所以不会重复调用 unless @versions.nil? @versions.each do |version,obj| #很粗暴的直接指定名称,各版本会在名称前加上版本前缀,比如thumb_ obj.set_prefix(@prefix, @name) end end "#{@name}.#{file.extension}" endend
使用CarrierWave上传图片时,多版本文件名的统一
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。