?
写两个简单的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文件,同样的方法
<object id="FlashID" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="690" height="90"> <param name="movie" value="<%=adver_flash.ad.url%>" /> <param name="quality" value="high" /> <param name="wmode" value="opaque" /> <param name="swfversion" value="9.0.45.0" /> <!-- 此 param 标签提示使用 Flash Player 6.0 r65 和更高版本的用户下载最新版本的 Flash Player。如果您不想让用户看到该提示,请将其删除。 --> <param name="expressinstall" value="<%=adver_flash.ad.url%>" /> <!-- 下一个对象标签用于非 IE 浏览器。所以使用 IECC 将其从 IE 隐藏。 --> <!--[if !IE]>--> <object type="application/x-shockwave-flash" data="<%=adver_flash.ad.url%>" width="690" height="90"> <!--<![endif]--> <param name="quality" value="high" /> <param name="wmode" value="opaque" /> <param name="swfversion" value="9.0.45.0" /> <param name="expressinstall" value="<%=adver_flash.ad.url%>" /> <!-- 浏览器将以下替代内容显示给使用 Flash Player 6.0 和更低版本的用户。 --> <div> <h4>此页面上的内容需要较新版本的 Adobe Flash Player。</h4> <p><a href="http://www.adobe.com/go/getflashplayer"><img src="http://img.68idc.cn/uploadfile/allimg/150301/1635201525-0.gif" alt="获取 Adobe Flash Player" width="112" height="33" /></a></p> </div> <!--[if !IE]>--> </object> <!--<![endif]--> </object>
??
??? 当然,这个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<<suffix
? ? ? 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过程了,因为是直接将图片路径存入数据库中,所以只要写文件方法。?
?
出门走好路,出口说好话,出手做好事。