사용자 정의 미리 보기 그림 크기 방안 공유 (nginx, lua nginx, GraphicsMagick)
3271 단어 GraphicsMagick
전자상거래 사 이 트 를 개발 할 때 같은 그림 은 서로 다른 사이즈 의 미리 보기 그림 이 필요 합 니 다. 보통 두 가지 전략 으로 미리 보기 그림 을 만 듭 니 다. 하 나 는 사진 을 올 릴 때 필요 한 미리 보기 그림 을 만 듭 니 다. 다른 하 나 는 지정 한 사이즈 의 그림 을 요청 할 때 생존 미리 보기 그림 을 만 드 는 것 입 니 다. 첫 번 째 방식 은 모든 사이즈 의 그림 을 미리 알 아야 합 니 다.두 번 째 방식 은 더욱 유연 하 다. 여 기 는 두 번 째 방안 (taobao 사이트 의 사진 이름 을 조회 하고 추측 한 방안 이 며 검증 을 한 후에 타 오 바 오도 이 방안 을 사용 하고 타 오 바 오 는 ImageMagick 만 사용 한 다 는 것 을 증명 했다) 을 사용한다.
여 기 는 주로 luanginx module 은 GraphicsMagick 명령 생존 미리 보기 그림 을 호출 합 니 다. 미리 보기 그림 의 사 이 즈 는 요청 그림 이름 에 포함 되 어 있 습 니 다. 예 를 들 어 xxxx. jpg. 80x 80. jpg 는 xxx. jpg 의 80x 80 크기 의 그림 크기 를 되 돌려 줍 니 다.nginx 설정 은 다음 과 같 습 니 다:
업로드 그림 이름 은 32 비트 무 작위 문 자 를 사용 하여 교체 합 니 다. 그림 저장 디 렉 터 리 는 그림 이름 앞의 6 개의 자모 이 고 두 개의 그룹 마다 3 층 디 렉 터 리 구 조 를 구성 하여 저장 합 니 다. 이렇게 하면 그림 을 서로 다른 디 렉 터 리 에 골 고루 저장 할 수 있 습 니 다.디 렉 터 리 저장 파일 의 수량 제한 을 피하 십시오.
서로 다른 사이즈 의 미리 보기 그림 을 마음대로 만 들 지 않도록 제한 을 두 었 습 니 다. imagesizes 에서 필요 한 미리 보기 그림 사 이 즈 를 정의 합 니 다.
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;
}