dong123qwe 2008-3-24 22:43
2008-03-25 rails 测试题(00006)
Rails应用的文件上传,(ex,上传图片),存入mysql里面,并在一个模板里显示图片.
drive2me 2008-3-26 10:25
看到好几位会员问过这类问题,希望他们能来放出自己的答案。
快来各显神通吧。
martin 2008-3-26 10:51
不建议这类型的题目,按我的猜测
1:一般的同学都有自己喜欢的方案
2:目前支持的插件很多。
3:本身没有太多的有趣的东西,枯燥了点。
4:完整实现并没有太大的意思,我估计几乎没有人愿意完全实现之。
这以类型题目,个人觉得不适合放在这里,可以采用教学的模式写文章发表出来。
jayliu 2008-3-26 16:00
我做公司上传多种图片使用的代码:
def create
@company=Company.new(params[:company])
if @company.save!
if @production_image
do_attach_upload(@production_image,@company.id,@company)
end
end
def do_attach_upload(production_image,id,company)
file_index = 0
uploadeds = production_image
@path=[]
if uploadeds
for uploaded in uploadeds
file_index = file_index + 1
if uploaded.size>20*1024*1024
flash[:notice] = "上传文件不能够超过20M."
return
end
unless uploaded.content_type =~ /image/
flash[:notice] = "文件类型不对"
return
end
base_folder = "/images/company/" + id.to_s + "/"
base_folder1 = "/images/company/"
if !File::exist?(base_folder1)
Dir::mkdir(base_folder1)
end
if !File::exist?(base_folder)
Dir::mkdir(base_folder)
end
if uploaded && uploaded.length > 0
store_path = base_folder + file_index.to_s + ".jpg"
@path<<store_path
File.open(store_path, "wb") { |f| f.write( uploaded.read ) }
end
end
end
@path_str=@path.join(',')
company.path=@path_str
company.save!
end
dong123qwe 2008-3-26 16:27
[quote]原帖由 [i]martin[/i] 于 2008-3-26 10:51 发表 [url=http://www.ruby-lang.org.cn/forums/redirect.php?goto=findpost&pid=13089&ptid=3914][img]http://www.ruby-lang.org.cn/forums/images/common/back.gif[/img][/url]
不建议这类型的题目,按我的猜测
1:一般的同学都有自己喜欢的方案
2:目前支持的插件很多。
3:本身没有太多的有趣的东西,枯燥了点。
4:完整实现并没有太大的意思,我估计几乎没有人愿意完全实现之。
... [/quote]
我们主要是面对初学者,初学者会经常遇到的问题,我们就值得出题.
用文章方式写出来,是个好建议.
[[i] 本帖最后由 dong123qwe 于 2008-3-26 16:29 编辑 [/i]]
drive2me 2008-3-26 21:22
[quote]原帖由 [i]martin[/i] 于 2008-3-26 10:51 发表 [url=http://www.ruby-lang.org.cn/forums/redirect.php?goto=findpost&pid=13089&ptid=3914][img]http://www.ruby-lang.org.cn/forums/images/common/back.gif[/img][/url]
不建议这类型的题目,按我的猜测
1:一般的同学都有自己喜欢的方案
2:目前支持的插件很多。
3:本身没有太多的有趣的东西,枯燥了点。
4:完整实现并没有太大的意思,我估计几乎没有人愿意完全实现之。
... [/quote]
我认为不一定把所有的代码都写出来。只要把思路和关键的代码写出来,指出若干种解法就可以了。
对吧。
:)
dong123qwe 2008-3-26 21:33
[quote]原帖由 [i]drive2me[/i] 于 2008-3-26 21:22 发表 [url=http://www.ruby-lang.org.cn/forums/redirect.php?goto=findpost&pid=13110&ptid=3914][img]http://www.ruby-lang.org.cn/forums/images/common/back.gif[/img][/url]
我认为不一定把所有的代码都写出来。只要把思路和关键的代码写出来,指出若干种解法就可以了。
对吧。
:) [/quote]
同意,如果把所有代码贴出,篇幅又太大.
把思路讲述清楚,贴出主要代码,都可以的.
dong123qwe 2008-3-26 22:43
[quote]原帖由 [i]dong123qwe[/i] 于 2008-3-24 22:43 发表 [url=http://www.ruby-lang.org.cn/forums/redirect.php?goto=findpost&pid=13000&ptid=3914][img]http://www.ruby-lang.org.cn/forums/images/common/back.gif[/img][/url]
Rails应用的文件上传,(ex,上传图片),存入mysql里面,并在一个模板里显示图片. [/quote]
下列代码允许用户上传一幅图片,并将图片和评论(comment)一道显示出来,为此我们先建一张pictures表来存储这些数据.
[color=sienna]../migrate/003_create_pictures.rb[/color]
[color=#a0522d] [/color][color=black] class CreatePictures < ActiveRecord: :Migration[/color]
[color=#000000] def self.up[/color]
[color=#000000] create_table :pictures do | t |[/color]
[color=#000000] t.column :comment, :string[/color]
[color=#000000] t.column :name, :string[/color]
[color=#000000] t.column :content_type, :string[/color]
[color=#000000] #if using MySQL, blobs deault to 64k, so we have to give an explicit size to extend them[/color]
[color=#000000] t.column :date, :binary, :limit =>1.megabyte[/color]
[color=#000000] end[/color]
[color=#000000] end[/color]
[color=#000000][/color]
[color=#000000] def self.down[/color]
[color=#000000] drop_table :pictures[/color]
[color=#000000] end[/color]
[color=#000000] end[/color]
[color=#000000]创建一个处理图片上传的控制器:[/color]
[color=sienna]../controllers/upload_controller.rb[/color]
[color=black] class UploadController < ApplicationController[/color]
def get
@pictures = Pictures.new
end
end
get.rhtml模板.
[color=darkred]../views/upload/get.rhtml[/color]
[color=black]<%= error_messages_for("pictures") %>[/color]
[color=#000000][/color]
[color=#000000]<% form_for( :picture,[/color]
[color=#000000] :url => { :action => 'save'},[/color]
[color=#000000] :html =>{:multipart => true}) do |form| %>[/color]
[color=#000000][/color]
[color=#000000]Comment: <%= form.text_field("comment") %><br/>[/color]
[color=#000000]Upload your picture: <% = form.file_field("uploaded_picture") %><br/>[/color]
[color=#000000][/color]
[color=#000000]<%= submit_tag("Upload file") %>[/color]
[color=#000000]<% end %>[/color]
这张表有一点微妙之处:上传的图片会被保存在uploaded_picture属性中,但数据库表里却没有这么个字段,也就是说,模型对象里必须做一些处理.
../models/picture.rb
class Picture < ActiveRecord :: Base
validates_format_of :content_type,
:with => /^image/,
:message => "--you can only upload pictures"
def upload_picture=(picture_field)
self.name = base_part_of(picture_field.original_filename)
self.content_type =picture_field.content_type.chomp
self.data =picture_field.read
end
def base_part_of(file_name)
File.basename(file_name).gsub(/[^\w._-]/ , ' ')
end
end
控制器中save()方法的实现也非常直观:
[color=darkred]../controllers/upload_controller.rb[/color]
[color=#8b0000] [/color][color=black] def save[/color]
[color=#000000] @picture = Picture.new(params[ :picture])[/color]
[color=#000000] if @picture.save[/color]
[color=#000000] redirect_to (:action => 'show' , :id => @picture.id )[/color]
[color=#000000] else[/color]
[color=#000000] render (:action => :get)[/color]
[color=#000000] end[/color]
[color=#000000]end[/color]
[color=#000000][/color]
[color=#000000]我们现在已经把图片保存在数据库了,要怎么显示它呢?[/color]
[color=#8b0000]../controllers/upload_controller.rb[/color]
[color=black] def picture[/color]
[color=#000000] @picture = Picture.find( params[:id])[/color]
[color=#000000] send_data (@picture.data,[/color]
[color=#000000] :filename => @picture.name,[/color]
[color=#000000] :type => @picture.content_type,[/color]
[color=#000000] :disposition => "inline")[/color]
[color=#000000] end[/color]
[color=#000000][/color]
[color=#000000]最后只要实现个show()这个action,[/color]
[color=#000000] def show[/color]
[color=#000000] @picture = Picture.find( params[ :id] )[/color]
[color=black] end[/color]
[color=#000000][/color]
[color=#000000]在模板中,我们用<img>标签指向显示图片内容的action.[/color]
[color=#000000][/color]
[color=#000000]<h3><%= @picture.comment %></h3>[/color]
[color=#000000]<img src="<% =url_for(:action => 'picture' , :id => @picture.id) %>" />[/color]
[color=#000000][/color]
[color=darkorange]后期将会点评,也希望大家来认真点评.[/color]
[color=#000000][/color]