子在川上曰

  逝者如斯夫不舍昼夜
随笔 - 71, 文章 - 0, 评论 - 915, 引用 - 0
数据加载中……

Rails验证码图片的实现

第一步:安装必须的软件

在linux下生成图片需要图片处理软件ImageMagick的Ruby语言RMagick库支持。安装RMagick最麻烦,我查了N多资料试了N次才安装成功。
   1. 安装ImageMagick:sudo apt-get install imagemagick
   2. 查看安装结果:dpkg -l | grep magick
   3. 更新软件包列表:sudo apt-get update
   4. 安装图片处理软件包libmagick9-dev:sudo apt-get install libmagick9-dev ruby1.8-dev
   5. 安装接口软件包RMagick:sudo gem install rmagick
   6. 说明:如果出现问题或者错误请执行下面命令:sudo apt-get remove --purge libmagick9-dev

在irb里require 'RMagick'。如果返回true,表示安装成功。

第二步:编码

在models目录创建一个proof_image.rb

require 'rubygems'
require 'RMagick'
class ProofImage
  include Magick
  attr_reader :text, :image
  Jiggle 
= 15
  Wobble 
= 15

  def initialize(len
=4)
    chars 
= ('a'..'z').to_a # + ('0'..'9').to_a
    text_array
=[]
    
1.upto(len) {text_array << chars[rand(chars.length)]}
    #background_type 
= "granite:" #花岗岩
    #background_type 
= "netscape:" #彩条
    #background_type 
= "xc:#EDF7E7" #指定背景色,例:xc:red
    #background_type 
= "null:" #纯黑
    granite 
= Magick::ImageList.new('null:')
    canvas 
= Magick::ImageList.new
    canvas.new_image(
32*len, 50, Magick::TextureFill.new(granite))
    gc 
= Magick::Draw.new
    gc.font_family 
= 'times'
    gc.pointsize 
= 40
    cur 
= 10

    text_array.each{
|c|
      rand(
10> 5 ? rot=rand(Wobble):rot= -rand(Wobble)
      rand(
10> 5 ? weight = NormalWeight : weight = BoldWeight
      gc.annotate(canvas,
0,0,cur,30+rand(Jiggle),c){
        self.rotation
=rot
        self.font_weight 
= weight
        self.fill 
= 'green'
      }
      cur 
+= 30
    }
    @text 
= text_array.to_s
    @image 
= canvas.to_blob{
      self.format
="GIF"
    }

    #生成图片文件
    #text.text(
00" ")
    #text.draw(canvas)
    #canvas.write('test.gif') #图片位于项目根目录下。也可以使用linux中的绝对路径如:
/home/chengang/test.gif

  end
end


在一个controller里加入一个方法,方法的作用是向网页提供图片数据。我选择创建一个专门的UtilController。

class UtilController < ApplicationController

  def proof_image
    proof_image 
= ProofImage.new
    session[:proof_text] 
= proof_image.text
    send_data proof_image.image, :type 
=> 'image/jpeg', :disposition => 'inline'
  end

end


以下是在页面中的调用代码:

输入验证码:<%=text_field(:proof, :text, :maxlength=>4%>
<img id="img" src="/chen/util/proof_image">
<a href="#" onclick="changeImage();return false;">换一个验证码</a><br/>


其中changeImage()是一个javascript函数,因为换图片时必须改变<img的src,否则浏览器不会执行UtilController的proof_image方法,而是从缓存中取得图片数据。

function changeImage(){
  $(
"img").src = "/chen/util/proof_image?tmp=" +new Date().getTime(); // Math.random();
}


我的环境:ubuntu 7.04 + Rails 1.2.3 +Ruby 1.8.5

posted on 2007-08-17 19:48 陈刚 阅读(2210) 评论(0)  编辑  收藏 所属分类: Rails&Ruby


只有注册用户登录后才能发表评论。


网站导航: