由于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