写两个简单的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://www.adobe.com/images/shared/download_buttons/get_flash_player.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过程了,因为是直接将图片路径存入数据库中,所以只要写文件方法。