mysql,Linux,HighPerformance,ruby on Rails

2010年2月15日星期一

免费的远程图片处理服务,仅使用Heroku和Imagery

先看例子:
http://lucidcode.co.nz/assets/4b70dca0dabe9d5d3700003e/harmony-app.png
可以远程转换:
http://images.lucidcode.co.nz/assets/4b70dca0dabe9d5d3700003e/harmony-app_medium.png

实现方法:
这里fork一份代码,注意这是一份Rack版本的应用。(什么是rack?
使用heroku直接创建一个目录,上传此代码就马上可以运行。

想在你的应用中使用这个缩略图处理服务需要一个小技巧:
你需要使用一个子域名绑定到heroku。免费,但需要你输入一次信用卡帐号信息。

为什么呢?因为核心代码是这个处理的:

run Imagery::Server.new

-------------挖掘深层代码分割线-----------------
[SvgGenerator, ImageVariantGenerator].each do |generator|
if image = generator.from_url(env['SERVER_NAME'].split('.')[1..-1].join('.'), env['PATH_INFO'] + (env['QUERY_STRING'].empty? ? '' : "?#{env['QUERY_STRING']}"))
return send_file(image)
end
end
标红的代码的作用就是把
'images.lucidcode.co.nz'换成'lucidcode.co.nz'
-------------挖掘深层代码分割线-----------------
def self.variant_parser
@variant_parser ||= /(.*)\_(#{Transformations.list.join('|')})(#{SupportedImageTypes.join('|')})/i
end

def self.from_url(server, path)
return nil unless path =~ variant_parser

remote_path = "#{$1}#{$3}"

file = Image.new(server, remote_path)
if file.found?
transform_content(file, $2)
file
else
nil
end
end
标红的代码就是拿到regex中的第一处匹配和第三处匹配。再看例子你就能明白:
irb(main):020:0* path = 'http://images.lucidcode.co.nz/assets/4b70dca0dabe9d5d3700003e/harmony-app_medium.png'
=> "http://images.lucidcode.co.nz/assets/4b70dca0dabe9d5d3700003e/harmony-app_medium.png"
irb(main):022:0* path =~ /(.*)_(medium|large|)(.png|.gif)/
=> 0
irb(main):023:0> $1
=> "http://images.lucidcode.co.nz/assets/4b70dca0dabe9d5d3700003e/harmony-app"
irb(main):024:0> $2
=> "medium"
irb(main):025:0> $3
=> ".png"
标红的地方就是精华,实际上就是拼字符串。把中间的_medium这个变量给去掉。得到实际的图片地址。

这个好东西有什么用处呢?
有,可以帮你节约一些图片存储空间。heroku一个应用可以有20M的免费空间。对于小图片来说,就能存储不少了。
好好利用,给你的免费用户使用这样的空间,应该可以帮你节约流量。

所有技术全部归于老外,我就是转转。

参考:
http://lucidcode.co.nz/blog/archives/2010/02/09/remote-thumbnails-with-heroku-and-imagery/
--
tommy xiao
E-mail: xiaods(AT)gmail.com

没有评论:

发表评论