Rails图片上传与显示

由于rails封装了表单中的file类型,从而使得它的上传和下载变的很简单,只需要调用上传的file表单对象[Tempfile]的read方法就可以轻松的得到所上传文件的二进制流。

其实一般的上传文件有保存与服务器端有两种方式,一种是直接将所上传的文件内容以二进制流的形式保存在数据库中,当然了这就要求数据库支持二进制流大对象;而另外的一种方式是将上传文件保存在服务器的指定目录下,这样就涉及到了文件读和写的处理。

这二种方式的选择完全取决于你自已,这要根据你项目的实际情况来决定。

下面重点就第二种方式对rails图片上传与显示做一个简单的介绍(本文中以使用网页编辑器KindEditer3.5.5为背景来进行)

1.首先建立Image类的数据迁移来形成存方图片的表:

class CreateImages < ActiveRecord::Migration
  def self.up
    create_table :images do |t|
      t.string :filename, :default => "", :null => false
      t.string :disk_filename, :default => "", :null => false
      t.integer :filesize, :default => 0, :null => false
      t.string :content_type, :limit => 60, :default => ""
      t.string :description
      t.integer :author_id, :default => 0, :null => false
      t.timestamp :created_on
    end
  end

  def self.down
    drop_table :images
  end
end

其中的filename为上传时的文件名,而disk_filename为上传后的文件保存在服务器端时的文件名,它是以ASCII码加时间截形成的文件名,这样防止了重名的现象

2.编写Image类

class Image < ActiveRecord::Base

  #上传的文件在服务器端上的目录路径
  cattr_accessor :storage_path
  @@storage_path = "#{RAILS_ROOT}/files"

  #这里由页面上提交的一个file表单对象来得到文件其它属性
  def file=(file_field)
    unless file_field.nil?
      @temp_file = file_field
      if @temp_file.size > 0
        self.filename = sanitize_filename(@temp_file.original_filename)
        self.disk_filename = Image.disk_filename(filename)
        self.content_type = @temp_file.content_type.to_s.chomp
        if content_type.blank?
          self.content_type = content_type_by_filename(filename)
        end
        self.filesize = @temp_file.size
      end
    end
  end

  #为Image对象设置file属性
  def file
    nil
  end

  #在保存image对象之前将上传的文件得到并保存在服务器上的目录中
  def before_save
    if @temp_file && (@temp_file.size > 0)
      #应用缓冲的方法得到文件的内容并将其保存
      File.open(diskfile, "wb") do |f|
        bu
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值