查看完整版本: 2008-03-25 rails 测试题(00006)

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]

krrish 2008-6-23 12:30

代码还不少
页: [1]
查看完整版本: 2008-03-25 rails 测试题(00006)