melin 写道
在开发电子商务网站时,同一个图片需要不同尺寸的缩略图片,一般有两种策略生成缩略图,一种在上传图片时,生成需要的缩略图,另一种是请求指定尺寸的图片时生存缩略图片,第一种方式有一定限制,就是需要提前知道所有尺寸的图片,而第二种方式更加灵活,这里采用第二种方案(也是查看taobao网站图片名称,猜想出来的方案,并加以验证,后来证实淘宝也是采用这个方案,只是淘宝使用ImageMagick)。
这里主要借助lua_nginx module调用GraphicsMagick命令生存生存缩略图片,缩略图片的尺寸包含在请求图片名称中,例如:xxxxx.jpg.80x80.jpg返回的就是xxx.jpg的80x80尺寸的图片大小。nginx配置如下:
上传图片名称使用32位随机字符替换掉,图片存放目录为图片名称前六个字母,每两个一组,构造三层目录结构存放,这样可以均匀存放图片在不同目录。避免目录存放文件数量限制。
为了避免随意生成不同尺寸的缩略图,这里做了限制,在image_sizes中定义了需要的缩略图尺寸。
location /testImg/ {
rewrite_by_lua '
local image_root = "/home/tomcat/eisp-files";
function file_notexists(name)
local f=io.open(name,"r")
if f~=nil then io.close(f) return false else return true end
end
local uri = ngx.re.sub(ngx.var.uri, "/testImg/([0-9a-zA-Z]+)/([0-9a-zA-Z]{2})([0-9a-zA-Z]{2})([0-9a-zA-Z]{2})([0-9a-zA-Z]+).([0-9a-zA-Z]+)", "/images/$1/$2/$3/$4/$2$3$4$5.$6", "o");
local index = string.find(uri, "([0-9]+)x([0-9]+)");
local originalUri = string.sub(uri, 0, index-2);
local area = string.sub(uri, index);
index = string.find(area, "([.])");
area = string.sub(area, 0, index-1);
if file_notexists(image_root .. uri) then
local image_sizes = {"80x80", "800x600", "40x40"};
function table.contains(table, element)
for _, value in pairs(table) do
if value == element then
return true
end
end
return false
end
if table.contains(image_sizes, area) then
local command = "gm convert " .. image_root .. originalUri .. " -thumbnail " .. area .. " -background gray -gravity center -extent " .. area .. " " .. image_root .. uri;
os.execute(command);
ngx.req.set_uri(uri, true);
else
ngx.exit(404);
end;
else
ngx.req.set_uri(uri, true);
end;
';
}
location /images/ {
alias /home/tomcat/eisp-files/images/;
expires 7d;
}
分享到:
相关推荐
**Nginx-Lua-GraphicsMagick:搭建高效图片处理服务** 在当今互联网时代,图片是网站内容的重要组成部分,无论是社交媒体、电子商务还是个人博客,都需要处理大量的图片。为了提高图片处理效率并减轻服务器负担,...
Nginx+Lua+GraphicsMagick实现动态生成指定尺寸的图片
OpenResty(Nginx+Lua)结合GraphicsMagick的解决方案,提供了一种强大的方法来实现这个目标。让我们深入探讨这个话题。 首先,OpenResty是一个基于Nginx Web服务器的扩展平台,它集成了LuaJIT,允许开发者用Lua...
GraphicsMagick Nginx + Lua + GraphicsMagick,实现自定义图片尺寸功能,支持两种模式[固定高宽模式,定高或定宽模式],支持FastDFS文件存储github地址: : 说明类似淘宝图片,实现自定义图片尺寸功能,可根据图片...
Docker+FastDFS+Nginx+Lua实现图片缩略图1、FastDFS安装1.1、镜像下载1.2、开启tracker容器1.3、开启storage容器1.4、测试2、FastDFS集成Nginx+lua2.1、依赖包下载2.2、安装软件基础包2.3、依赖安装2.4、配置Lua脚本...
nginx-lua-GraphicsMagick网站中,需要根据需求,动态生成缩略图,网上找了些别人写好的脚本,也在github上找到了一些,自己稍微改写了下,让脚本同时支持00.jpg_80x80.jpg和00_80x80.jpg的2种格式。具体可以参考...
通过Lua脚本,开发者可以在Tengine中集成GraphicsMagick的功能,实现动态生成和处理图像,比如用户上传图片后立即生成预览图,或者根据需求动态调整图片尺寸。这样的组合使得服务器在处理图像相关的业务时更加高效,...