写两个简单的rails 上传图片功能
一 rails 插件: paperclip-2.4.3.gem
1 gem install paperclip-2.4.3.gem,当数据删除时,自己做删除文件操作
2 新建model 表图片字段,
字段分为三个,假设model 引用字段名:photo ,则三个字段为
t.string :photo_file_name 图片名
t.string :photo_content_type 图片类型
t.string :photo_file_size 图片大小
后面字段名不能变
3 表的model 引用, has_attached_file :photo
4 页面上,假设 form_for 表单提单
<%= f.file_field :photo %>
5 使用图片时
<%=image_tag @organization.photo.url %>
OK 了,我是在rails 3 中使用的,插件是将图片的路径为三部分保存,图片存放在 。。\public\system\
今天试了一下,也可以上传swf文件,同样的方法
当然,这个paperclip 插件并不支持文件名为中文的上传方式,解决方法可以在上传时,自己重新命名文件名为数字或是别得什么的。
before_create :randomize_file_name
def randomize_file_name
extension = File.extname(elaPDF_file_name).downcase
self.elaPDF.instance_write(:file_name, "#{Time.now.strftime("%y%m%d%H%M%S") + rand(100).to_s}#{extension}")
end
return nil if uploaded_file.nil?
extension = File.extname(uploaded_file.original_filename).downcase
@queued_for_write[:original] = to_tempfile(uploaded_file)
instance_write(:file_name, "#{Time.now.strftime("%Y%m%d%H%M%S")}#{rand(1000)}#{extension}")
instance_write(:content_type, uploaded_file.content_type.to_s.strip) instance_write(:file_size, uploaded_file.size.to_i)
instance_write(:fingerprint, generate_fingerprint(uploaded_file))
instance_write(:updated_at, Time.now)
二 使用rails 方法 ,也就是很多人用得方法,此处为多张图片保存到第二张表中的方法
1 页面上写法
<%=file_field_tag "pic_path[]"%>
2 表单controller 方法
if params[:pic_path] && params[:pic_path].size!=0
params[:pic_path].each do |pic_path|
photo_path=ZyFenxiangPhoto.send_picture(pic_path, zy_fenxiang.id)
ZyFenxiangPhoto.create(:zy_fenxiang_id=>zy_fenxiang.id,:photo_path=>photo_path)
end
end
3 "ZyFenxiangPhoto" model 方法写法
#上传图片
def self.send_picture pic_path, fenxiang_id
name = Time.now.strftime("%y%m%d%I%M%S") + 'size'+ pic_path.size.to_s
suffix=File.extname("#{pic_path.original_filename}")
name< directory = UPPATH+"/zy_fenxiangs/#{fenxiang_id}/" if !File.exist?(directory) FileUtils.mkdir_p(directory) #创建文件夹 end path = File.join(directory, name) filesave(pic_path,path) return "/assets/zy_fenxiangs/#{fenxiang_id}/"+name end #UPPATH='D:/items/zyt/zyt/app/assets/images' 生产或是开发模式下 #文件上传处理 def self.filesave(upload,path) File.open(path, "wb") { |f| f.write(upload.read) } end 4 \config\environment.rb 初始路径 environment.rb # Load the rails application require File.expand_path('../application', __FILE__) 5 提交表单 6 使用图片url 直接使用数据地址,因为它是将图片路径直接写入到数据库中 7 删除记录同时,同时删除图片 controller 方法 zy_fenxiang.zy_fenxiang_photos.each do |zy_fenxiang_photo| zy_fenxiang_photo.filedelete ##删除图片文件 zy_fenxiang_photo.destroy end model 方法 #删除图片文件 def filedelete photo_path=self.photo_path name=photo_path.split("/")[photo_path.split("/").length-1] if File.exist?("#{UPPATH}/zy_fenxiangs/#{self.zy_fenxiang_id}/"+name) File.delete("#{UPPATH}/zy_fenxiangs/#{self.zy_fenxiang_id}/"+name) end end 以上七步,OK过程了,因为是直接将图片路径存入数据库中,所以只要写文件方法。