rails文件上传
除了通过paperclip等插件来上传文件之外,也可以不用插件,用ruby的File模块中的方法来实现文件上传。
一、控制器
在控制器中加入以下两个方法,其中getfilename用来修改所上传的文件名称,
在我所上传的文件中存在空格,会出现,系统找不到文件的错误,所以将文件中的空格去掉,
def uploadfile(file)
if !file.original_filename.empty?
@filename=getfilename(file.original_filename)
#设置目录路径,如果目录不存在,生成新目录
FileUtils.mkdir("#{RAILS_ROOT}/db/upload") unless File.exist?("#{RAILS_ROOT}/db/upload")
#写入文件
File.open("#{RAILS_ROOT}/db/upload/#{@filename}", "wb") do |f|
f.write(file.read)
end
return @filename
end
end
#文件名
def getfilename(filename)
if !filename.nil?
filename.split(' ').to_s
end
end
二、视图
form_tag的模板:
<% form_tag :multipart => true do %>
<%= file_field_tag "photo" %>
<% end %>
form_for的模板:
<% form_for :user, @product, :html => { :multipart => true } do |f| %>
<%= f.file_field :photo%>
<% end %>
注意:两种表单multipart属性的写法,通过加这个属性使表单支持上传文件,不加这个属性或写的不对,会报下面的错 误.
NoMethodError (undefined method `original_filename' for " 20100824 1427.sql":String):
app/controllers/admin/dbmanager_controller.rb:56:in `uploadfile'
app/controllers/admin/dbmanager_controller.rb:32:in `restore'
c:/ruby/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
c:/ruby/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
c:/ruby/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
c:/ruby/lib/ruby/1.8/webrick/server.rb:162:in `start'
c:/ruby/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
c:/ruby/lib/ruby/1.8/webrick/server.rb:95:in `start'
c:/ruby/lib/ruby/1.8/webrick/server.rb:92:in `each'
c:/ruby/lib/ruby/1.8/webrick/server.rb:92:in `start'
c:/ruby/lib/ruby/1.8/webrick/server.rb:23:in `start'
c:/ruby/lib/ruby/1.8/webrick/server.rb:82:in `start'
读取图片时:
<%= image_tag @product.photo.url %>