사용자 정의 미리 보기 그림 크기 방안 공유 (nginx, lua nginx, GraphicsMagick)

3271 단어 GraphicsMagick
melin
    전자상거래 사 이 트 를 개발 할 때 같은 그림 은 서로 다른 사이즈 의 미리 보기 그림 이 필요 합 니 다. 보통 두 가지 전략 으로 미리 보기 그림 을 만 듭 니 다. 하 나 는 사진 을 올 릴 때 필요 한 미리 보기 그림 을 만 듭 니 다. 다른 하 나 는 지정 한 사이즈 의 그림 을 요청 할 때 생존 미리 보기 그림 을 만 드 는 것 입 니 다. 첫 번 째 방식 은 모든 사이즈 의 그림 을 미리 알 아야 합 니 다.두 번 째 방식 은 더욱 유연 하 다. 여 기 는 두 번 째 방안 (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;
        }


좋은 웹페이지 즐겨찾기