看到李华顺的《Carrierwave 如何配置合理的上传文件名》是这么写的:
def filename
if original_filename
# current_path 是 Carrierwave 上传过程临时创建的一个文件,有时间标记
# 例如: /Users/jason/work/ruby-china/public/uploads/tmp/20131105-1057-46664-5614/_____2013-11-05___10.37.50.png
@name ||= Digest::MD5.hexdigest(current_path)
"#{@name}.#{file.extension}"
end
end
但看日期是 2011 年写的,而且 ruby-china 好像同时使用了两种。
在《photo_uploader.rb》是:
def filename
if super.present?
# current_path 是 Carrierwave 上传过程临时创建的一个文件,有时间标记,所以它将是唯一的
# 此方法只使用 Ruby China 这类图片上传的场景
@name ||= Digest::MD5.hexdigest(current_path)
"#{Time.now.year}/#{@name}.#{file.extension.downcase}"
end
end
在《avatar_uploader.rb》是:
def filename
if super.present?
"avatar/#{model.id}.jpg"
end
end
注,在《base_uploader.rb》里设置了前半部分
def store_dir
"#{model.class.to_s.underscore}"
end
这两种使用场景怎么区分?怎么写比较好?
我以前是这样写的
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
没有直接设置 filename,结果是生成的文件名是uploads/project/avatar/1/1-__________________.jpg
,好像所有中文都变成下划线,好怪……
大家都怎么弄的?
我 logo 字段本身就在 something model 里,在新建 something 时就上传图片,那就统一在保存时保存数据,不用 ajax 上传(而在富文本编辑器 simditor 中我是用 ajax 上传的)。 我想在上传之前就显示预览图片,怎么弄? 正在研究这个帖子《Preview an image before it is uploaded》 目前我表单的结构是
<%= f.input :logo, as: :file, label:"LOGO",
hint: "支持JPG、GIF、PNG格式图片,不超过5M" %>
<%= image_tag(@something.logo_url, class:'img-responsive') if @something.logo %>
<%= f.hidden_field :logo_cache %>
额,忽然想到,看 simditor 的源码会不会就有这个功能的实现? 另外看到一个Jasny Bootstrap实现的上传按钮就很好,样式也不错,而且上传后有删除按钮,也有预览……咋抄下呢?
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
# Override the filename of the uploaded files:
# 参考李华顺的帖子(http://huacnlee.com/blog/carrierwave-upload-store-file-name-config/)
def filename
if original_filename
@name ||= Digest::MD5.hexdigest(current_path)
"#{@name}.#{file.extension}"
end
end
不过李华顺说我理解错了……额,在我想明白哪错了之前,先用这个方案吧……
抄的Jasny Bootstrap的 js 和 css 代码, fileinput.js和_fileinput.scss
再改改样式,再配合 simple_form
<div>
<span class="btn btn-default btn-file">
<span class="fileinput-new">选择图片</span>
<span class="fileinput-exists">更换图片</span>
<%= f.input_field :logo, as: :file, label:false %>
</span>
<a href="#" class="close fileinput-exists" data-dismiss="fileinput" style="float: none">×</a>
<p class="help-block">支持JPG、GIF、PNG格式图片,不超过5M</p>
</div>
<div class="fileinput-preview thumbnail" data-trigger="fileinput">
<img class="img-responsive" src="/images/default-placeholder.jpg" alt="Default placeholder">
</div>
李华顺说「uploads 这个应该是 Nginx 上面配置的」,我一直是自己在项目文件中设置 shared/public/uploaders 文件夹的,这个等有时间再深入研究下……