使用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}"
	end

end

  

时间: 2024-10-02 07:44:05

使用CarrierWave上传图片时,多版本文件名的统一的相关文章

wordpress上传图片时重命名--修改插件时遇到的一些问题

wordpress是用php语言开发的博客平台,它扩展性强,容易扩展,很适合拿来做二次开发. 1,问题由来 本周五,我在浏览公司的网站(基于wordpress开发)时发现,网站首页上有两篇文章的缩略图重复了,于是我进入网站后台检查,想看下是不是某位员工在撰写文章时不小心这两篇文章选择了相同的图片作为封面图片. 结果发现这两篇文章选用的封面图片的文件名还真是相同,但我转念又想到,员工再糊涂也不至于犯这样的错误.于是,我检查了下这几篇文章的封面图片url地址,这些地址是相同的. 我想到,有可能是这两

百度编辑器 Ueditor 上传图片时打开文件夹的延迟问题,点击上传图片弹窗打开慢问题

在使用 ueditor 开发时, 作为一个web文本编辑器使用时. 当点击上传图片时, 文件夹要延迟好久才能打开. 解决: 针对多图片上传, 将/ueditor/dialogs/image/image.js 文件下的以下代码 1 2 3 4 5 accept: {                     title: 'Images',                     extensions: acceptExtensions,                     mimeTypes:

关于 百度 Ueditor (在chrome浏览器) 上传图片时 打开文件夹的延迟问题

在使用 ueditor 开发时, 作为一个web文本编辑器使用时. 当点击上传图片时, 文件夹要延迟好久才能打开. 解决: 针对多图片上传, 将/ueditor/dialogs/image/image.js 文件下的以下代码 accept: { title: 'Images', extensions: acceptExtensions, mimeTypes: 'image/*' }, 改为 accept: { title: 'Images', extensions: acceptExtensio

Web Uploader初始化隐藏容器失败及点击上传图片时反应较慢的问题

问题1:在一个页面集成一个或者多个文件上传插件,初始化时有些DOM容器是隐藏的,这时候经常会出现初始化失败的情况,虽然按钮样式改变了,但是点击就是没反应(有时候不经意点了哪个地方,或许会出现文件选择框),仔细看了一下,发现了问题所在,如下图: 实例化的时候,会在初始选定的选择按钮上生成一层"label"遮罩层,点击事件也是绑定在label上,但如果实例化时,指定的DOM是隐藏的(display:none)话,只能生成1x1的遮罩,而点击事件依然绑定在label上,始终点击不到,当然也就

Rails利用carrierwave上传图片

1.添加gem gem 'carrierwave' gem 'mini_magick' #不使用rmagick,占内存 2.bundle install 3.为users表添加一个avatar字段,也可以为其他名称,注意相应的代码修改 rails g migration add_avatar_to_users avatar:string rake db:migrate 4.生成Avatar,跟你添加的字段相同 rails generate uploader Avatar #将会生成文件app/u

内核模块编译时怎样绕过insmod时的版本检查

1.Uboot:每个arm芯片或者海斯芯片都有各自的uboot. 2.但他们的内核版本可以是一样的,主要是跟各自内核的进行的编译选项有关, 31的内核版本里加了版本检查选项“Kernel type->Symmetrical Multi-Processing”,而21的内核版本没有设置该选项. -------------------------------------------------------------------------------------------------------

解决linux下部署科大讯飞时的版本过低问题

在将项目部 署到阿里云服务器之后,需要将科大讯飞SDK下的libmsc64.so依赖库文件上传至/usr/java/jdk1.8.0_121/jre/lib/amd64路径下 在Windows下(Eclipse里直接运行Tomcat)调用语音转文字接口没问题,但部署到阿里云Linux上后,只要调用语音转文字接口就会报错,报错代码如下: 一开始从上图红框中的地方找原因,走了很多弯路,后面看下面的错误代码,终于找到方向如下图 然后开始注意到GLIBC_2.15 not found,阅读该博客后htt

SaltStack安装时python版本冲突导致安装失败

yum -y install salt-master 安装时,出现以下报错: file /usr/lib64/python2.6/zipfile.pyc from install of python-libs-2.6.6-66.el6_8.x86_64 conflicts with file from package python-2.6.6-36.el6.x86_64 file /usr/lib64/python2.6/zipfile.pyo from install of python-li

jdk安装时的版本问题以及如何配置环境变量的问题

Eclipse必须先安装jdk(JDK是环境,eclipse是工具,总是先有环境才会有工具的吧), myeclipse安装程序中集成了jdk,但一般不是最新的. 32位的系统必须装32位的jdk和32位的Eclipse:64位的系统可以装32位的jdk和32位的Eclipse(要么2个都是32),或者装64位的jdk和64位的Eclipse(要么两个都是64). 要查询一个系统安装的jdk的版本问题可以在运行里面输入java -verison后就会出现系统安装的是哪个版本的jdk. 如何配置jd