打印

2008-03-25 rails 测试题(00006)

2008-03-25 rails 测试题(00006)

Rails应用的文件上传,(ex,上传图片),存入mysql里面,并在一个模板里显示图片.
本帖最近评分记录
  • drive2me R币 +5 好问题! 2008-3-26 10:24

TOP

看到好几位会员问过这类问题,希望他们能来放出自己的答案。

快来各显神通吧。
Flying Piggy...! 
天地人合一!

TOP

不建议这类型的题目,按我的猜测
1:一般的同学都有自己喜欢的方案
2:目前支持的插件很多。
3:本身没有太多的有趣的东西,枯燥了点。
4:完整实现并没有太大的意思,我估计几乎没有人愿意完全实现之。

这以类型题目,个人觉得不适合放在这里,可以采用教学的模式写文章发表出来。
本帖最近评分记录
  • wscc111 R币 +2 好可爱的小妹妹啊__指图片 2008-3-26 12:00

TOP

我做公司上传多种图片使用的代码:
 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
本帖最近评分记录

TOP

引用:
原帖由 martin 于 2008-3-26 10:51 发表
不建议这类型的题目,按我的猜测
1:一般的同学都有自己喜欢的方案
2:目前支持的插件很多。
3:本身没有太多的有趣的东西,枯燥了点。
4:完整实现并没有太大的意思,我估计几乎没有人愿意完全实现之。

...
我们主要是面对初学者,初学者会经常遇到的问题,我们就值得出题.
用文章方式写出来,是个好建议.

[ 本帖最后由 dong123qwe 于 2008-3-26 16:29 编辑 ]

TOP

引用:
原帖由 martin 于 2008-3-26 10:51 发表
不建议这类型的题目,按我的猜测
1:一般的同学都有自己喜欢的方案
2:目前支持的插件很多。
3:本身没有太多的有趣的东西,枯燥了点。
4:完整实现并没有太大的意思,我估计几乎没有人愿意完全实现之。

...
我认为不一定把所有的代码都写出来。只要把思路和关键的代码写出来,指出若干种解法就可以了。
对吧。

:)
Flying Piggy...! 
天地人合一!

TOP

引用:
原帖由 drive2me 于 2008-3-26 21:22 发表



我认为不一定把所有的代码都写出来。只要把思路和关键的代码写出来,指出若干种解法就可以了。
对吧。

:)
同意,如果把所有代码贴出,篇幅又太大.
把思路讲述清楚,贴出主要代码,都可以的.
create success (眼光,寂寞,做事) value(远,耐的住,黑暗);

TOP

引用:
原帖由 dong123qwe 于 2008-3-24 22:43 发表
Rails应用的文件上传,(ex,上传图片),存入mysql里面,并在一个模板里显示图片.
下列代码允许用户上传一幅图片,并将图片和评论(comment)一道显示出来,为此我们先建一张pictures表来存储这些数据.
../migrate/003_create_pictures.rb
class CreatePictures < ActiveRecord: :Migration
  def self.up
    create_table :pictures do | t |
     t.column :comment,   :string
     t.column :name,     :string
     t.column :content_type, :string
     #if using MySQL, blobs deault to 64k, so we have to give an explicit size to extend them
     t.column :date,     :binary, :limit =>1.megabyte
    end
  end

  def self.down
   drop_table :pictures
  end
end
创建一个处理图片上传的控制器:
../controllers/upload_controller.rb
class UploadController < ApplicationController
 def get
  @pictures = Pictures.new
 end
end

get.rhtml模板.
../views/upload/get.rhtml
<%= error_messages_for("pictures") %>

<% form_for( :picture,
       :url => { :action => 'save'},
       :html =>{:multipart => true}) do |form| %>

Comment:     <%= form.text_field("comment") %><br/>
Upload your picture: <% = form.file_field("uploaded_picture") %><br/>

<%= submit_tag("Upload file") %>
<% end %>

这张表有一点微妙之处:上传的图片会被保存在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()方法的实现也非常直观:
../controllers/upload_controller.rb
def save
  @picture = Picture.new(params[ :picture])
  if @picture.save
   redirect_to (:action => 'show' , :id => @picture.id )
  else
   render (:action => :get)
  end
end

我们现在已经把图片保存在数据库了,要怎么显示它呢?
../controllers/upload_controller.rb
def picture
  @picture = Picture.find( params[:id])
  send_data (@picture.data,
       :filename => @picture.name,
       :type => @picture.content_type,
       :disposition => "inline")
 end

最后只要实现个show()这个action,
 def show
  @picture = Picture.find( params[ :id] )
 end

在模板中,我们用<img>标签指向显示图片内容的action.

<h3><%= @picture.comment %></h3>
<img src="<% =url_for(:action => 'picture' , :id => @picture.id) %>" />

后期将会点评,也希望大家来认真点评.


create success (眼光,寂寞,做事) value(远,耐的住,黑暗);

TOP

代码还不少
本帖最近评分记录
  • dong123qwe R币 +2 理解了代码就不多了 2008-6-23 12:39

TOP

2008-08-29 11:06 Crawled by CCBot/1.0 (+http://www.commoncrawl.org/bot.html) @38.103.63.60