每天一剂Rails良药之Processing Uploaded Images

今天来看看Rails怎样做Image的thumbnail
我们需要[url=http://rmagick.rubyforge.org]RMagick[/url],它是ImageMagick/GraphicsMagick的Ruby API
我们先安装好ImageMagic/GraphicsMagick,然后安装RMagick:
[code]
sudo gem install rmagick
[/code]
上传表单:
[code]
<% form_fo :image, @image, url=> {:action => 'create'}, :html=>{:multipart=>true} do |f| %>
<label for='image_name'>Name:</label>
<%= f.text_field :name %><br/>
<label for='image_file_data'>Image File:</label>
<%= f.file_field :file_data %></br/>
<label for='image_description'>Description:</label><br/>
<%= f.text_area :description, :cols => 80, :rows => 5 %><br/>
<% submit_tag "Save" %>
<% end %>
[/code]
Controller:
[code]
def create
@image = Image.create params[:image]
end
[/code]
app/models/image.rb:
[code]
require 'RMagick'

class Image < ActiveRecord::Base

DIRECTORY = 'public/uploaded_images'
THUMB_MAX_SIZE = [125, 125]

after_save :process
after_destroy :cleanup

def file_date=(file_data)
@file_data = file_data
write_attribute 'extension',
file_data.original_filename.split('.').last.downcase
end

def url
path.sub(/^public/, '')
end

def thumbnail_url
thumbnail_path.sub(/^public/, '')
end

def path
File.join(DIRECTORY, "#{self.id}-full.#{extension}")
end

def thumbnail_path
File.join(DIRECTORY, "#{self.id}-thumb.#{extension}")
end

#######
private
#######

def process
if @file_data
create_directory
cleanup
save_fullsize
create_thumbnail
@file_data = nil
end
end

def save_fullsize
File.open(path, 'w') do |file|
file.puts @file_data.read
end
end

def create_thumbnail
img = Magick::Image.read(path).first
thumbnail = img.thumbnail(*THUMB_MAX_SIZE)
thumbnail.write thumbnail_path

def create_directory
FileUtils.mkdir_p DIRECTORY
end

def cleanup
Dir[File.join(DIRECTORY, "#{self.id}-*")].each do |filename|
File.unlink(filename) rescue nil
end
end

end
[/code]

另外[url=http://www.kanthak.net/opensource/file_column/]file_column[/url]插件有一些更高级的特性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值