没有特殊申明,我的代码都是在mysql5.0 + netbeans-for-ruby下测试通过的
1。Model
我创建了一张表:mysql> describe photos;
+------------+--------------+------+-----+---------------------+---------------
+
| Field | Type | Null | Key | Default | Extra
|
+------------+--------------+------+-----+---------------------+---------------
+
| id | int(11) | NO | PRI | NULL | auto_increment
|
| album_id | int(11) | YES | MUL | 1 |
|
| url | varchar(255) | NO | | NULL |
|
| name | varchar(255) | YES | | NULL |
|
| created_at | datetime | YES | | 0000-00-00 00:00:00 |
|
+------------+--------------+------+-----+---------------------+---------------
generate 一个model:
class Photo < ActiveRecord::Base
end
不需要任何代码,当然也可以添加检查代码:
validates_format_of :url,
:with=>/^.*(.jpg|.JPG|.gif|.GIF)$/,
:message => "你只能上传JPG或则GIF的图片文件"
2。controller
#以下是关于文件上传的代码
before_filter :configure_charsets
def configure_charsets
@headers["Content-Type"]="text/html;charset=utf-8"
end
def upload
end
def upload_file(file)
if !file.original_filename.empty?
@filename=get_file_name(file.original_filename)
File.open("#{RAILS_ROOT}/public/uploads/#{@filename}", "wb") do |f|
f.write(file.read)
end
return @filename
end
end
def get_file_name(filename)
if !filename.nil?
Time.now.strftime("%Y%m%d%H%M%S") + '_' + filename
end
end
def save_file
unless request.get?
if filename=upload_file(params[:file]['file'])
return filename
end
end
end
#==============================
# 修改create方法:
def create
@photo = Photo.new(params[:photo])
@filename=save_file #调用save_file方法,返回文件名
@photo.url="/uploads/#{@filename}" #保存文件路径字段
@photo.name=(@filename)[15,@filename.length] #保存文件名字段
if @photo.save
flash[:notice] = 'Photo was successfully created.'
redirect_to :action => 'list'
else
render :action => 'new'
end
end
3。View
修改:_form.rhtml
Upload your file: <%= file_field("file", "file") %>
修改:new.rhtml
<h1>New photo</h1>
<%= form_tag({:action => 'create'}, :multipart => true) %>
<%= render :partial => 'form' %>
<%= submit_tag("Upload file") %>
<%= end_form_tag %>
修改:show.rhtml
<%= image_tag url_for_file_column("entry", "image") %>
不行的话,用<img src='<%=@photo.url%>'.....
这里,没有用到任何有关文件上传的插件。所以,用起来比较单纯,上传的文件都放在路径/public/uploads/