2016년 6월 2일 목요일

컨텍스트 외부 이미지 불러오기

http://www.ideasound.co.kr/index.php/%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8-%EC%99%B8%EB%B6%80-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B6%88%EB%9F%AC%EC%98%A4%EA%B8%B0/


컨텍스트 외부 이미지 불러오기

웹 개발을 하다보면 context root가 아닌 외부 경로에서 이미지를 불러와야 하는 경우가 발생한다.
즉 컨텍스트 외부 이미지를 불러오는 것이다.
자세한 상황은 이렇다고 치자. (톰캣을 사용한다는 가정하에)
-Tomcat 설치 경로 : C:/apache-tomcat-7.0.42/
-Web-app 경로 : C:/apache-tomcat-7.0.42/webapp/ROOT
-Image 저장 경로 : D:/images
-host name:localhost
이미지는 D:/images에 위치해있는데 컨텍스트는 위의 경로에서 돌고 있다.
이 경우 클라이언트 측에서는 D:/images에 직접 접근할 수 없다. 이유는 webapp 경로 밖에 있기 때문이다.
원리는 이렇다.
1) 이미지를 처리할 서블릿을 만든다.(스프링의 경우 Controller 추가)
2) 불러올 이미지에 대한 식별값을 파라미터로 받도록 한다.(DB에서 이미지 경로를 가져오는 경우 해당 레코드의 key를 받아오면 되겠다.)
3) I/O를 이용하여 이미지를 뿌린다.
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

class ImageServlet extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse res){

      // 불러와야할 이미지에 대한 식별값을 파라미터로 받아옴.
      String imgId = request.getParameter("imgId");

      String imgName = ImageDao.getInstance().getImage(imgId);
      String pathString = "D:\\images";
      File file = new File((pathString + File.separator + imgName ));
      FileInputStream fis = null;
  
      BufferedInputStream in = null;
      ByteArrayOutputStream bStream = null;
      try{
          fis = new FileInputStream(file);
   in = new BufferedInputStream(fis);
   bStream = new ByteArrayOutputStream();
   int imgByte;
   while ((imgByte = in.read()) != -1) {
      bStream.write(imgByte);
   }

//      response.setHeader("Content-Type", type);
      response.setContentLength(bStream.size());
   
      bStream.writeTo(response.getOutputStream());
      response.getOutputStream().flush();
      response.getOutputStream().close();

      } catch (Exception e) {
         e.printStackTrace();
      } finally {
         if (bStream != null) {
    try {
       bStream.close();
    } catch (Exception est) {
       est.printStackTrace();
    }
      }
         if (in != null) {
    try {in.close();}
           catch (Exception ei) { ei.printStackTrace(); }
  }
  if (fis != null) {
     try {fis.close();}
            catch (Exception efis) { efis.printStackTrace(); }
  }
      }
      
 }

}

댓글 없음:

댓글 쓰기