[导入]generic file and image models for uploaded files

These are basic models that store a file in a dedicated files table. Use has_one or has_many to associate this with your actual models. RMagick is required for images.

This is my first code dealing with uploads and rmagick, so please comment if you have suggestions.

class DbFile < ActiveRecord::Base
IMAGE_TYPES = ['image/jpeg', 'image/pjpeg', 'image/gif', 'image/png', 'image/x-png']
before_validation :sanitize_filename
validates_presence_of :size, :filename, :content_type

class << self
def new_file(file_data)
content_type = file_data.content_type.strip
(IMAGE_TYPES.include?(content_type) ? DbImage : DbFile).new \
:data => file_data.read,
:filename => file_data.original_filename,
:size => file_data.size,
:content_type => content_type
end
end

protected
def sanitize_filename
# NOTE: File.basename doesn't work right with Windows paths on Unix
# get only the filename, not the whole path
filename.gsub! /^.*(\\|\/)/, ''

# Finally, replace all non alphanumeric, underscore or periods with underscore
filename.gsub! /[^\w\.\-]/, '_'
end
end

require 'rmagick'
require 'base64'
class DbImage < DbFile
def data=(file_data)
with_image(file_data, true) do |img|
self.width = img.columns
self.height = img.rows
end
end

def with_image(file_data = nil, save_image = false, &block)
img = Magick::Image::read_inline(Base64.b64encode(file_data || self.data)).first
block.call(img)
write_attribute('data', img.to_blob) if save_image
img = nil
GC.start
end
end


Controller Usage:

# returns DbImage if content_type matches
db_file = DbFile.new_file(params[:file][:data])
db_file.save


Model Usage:

# raw binary image data
File.open('my_file', 'w') { |f| f.write(db_file.data) }

# Image resizing with rmagick
# automatically creates RMagick::Image and
# invokes GC.start
db_file.with_image do |img|
img.scale(.25)
img.write('thumb.jpg')
end

文章来源: http://snippets.dzone.com/posts/show/793

转载于:https://www.cnblogs.com/zoujiaxue/archive/2007/12/07/987057.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值