rails 上传图片功能

 

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


 

你可能感兴趣的:(Ruby,Rails,ruby 图片,rails上传图片)