본문 바로가기

카테고리 없음

ImageStreamingServlet

1.파일시스템경로로 이미지출력하기

/**
 * D://contents/Tulip.jpg 파일을 중계하는 서블릿.
 * 이미지 파일을 읽고(input),
 * stream copy
 * 스트리밍 컨텐츠로 출력(output)
 * Content-Type(MIME)설정필요.
 * 1. source 확보(D://contents/Tulip.jpg)
 * 2. source 대상 input 스트림 개방
 *    FileinputStream
 * 3. destination 확보(response)
 * 4. dest 대상 output 스트림 개방
 *      response.getOutputStream
 * 5. in/out stream copy 
 *
 */
@WebServlet("/image2.do")
public class ImageStreamingServlet2 extends HttpServlet{
   // Servlset 
   private ServletContext application;
   @Override
      public void init() throws ServletException {
      application = getServletContext();
   }
   
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      File source= new File("D://contents/cub.jpg"); //파일 시스템
      String mime = application.getMimeType(source.getName());
      resp.setContentType(mime);

      FileInputStream fis = new FileInputStream(source);//파일이름
      //주어진 파일 객체가 가리키는 파일을 바이트 스트림으로 읽기위한 fileinputstream 객체를 생성
    
      OutputStream os = resp.getOutputStream();
      byte[] buffer = new byte[1024];
      int length= -1;
      while((length = fis.read(buffer))!= -1) {
         os.write(buffer,0,length);
      }
      fis.close();
      os.close();
      
   }
   
}

ServletContext ? 

웹 애플리케이션 단위로 정보를 서버 쪽에 유지할 수 있는 방법은 ServletContext 객체를 사용

  • 톰캣이 실행되면서 생성됩니다.
  • 서블릿 컨텍스트(ServletContext)란 하나의 서블릿이 서블릿 컨테이너와 통신하기 위해서 사용되어지는 메서드들을 가지고 있는 클래스가 바로 ServletContext다.
  • 하나의 web application 내에 하나의 컨텍스트가 존재합니다. web application내에 있는 모든 서블릿들을 관리하며 정보공유할 수 있게 도와 주는 역할을 담당하는 놈이 바로 ServletContext다.
  • 쉽게 말하면 웹 애플리케이션의 등록 정보라고 볼 수 있다.
  • 필터와 리스너 또한 등록하여 통신 간에 활용할 수 있다.
    • 리스너는 서블릿 리스너, 세션 리스너 등 EventListener 구현체는 뭐든지 등록할 수 있다.
    • 필터는 characterEncoding 등 Filter 구현체는 뭐든지 등록할 수 있다

 

application.getMimeType(source.getName)

문자열로 주어진 지정한 파일의 MIME 타입을 return

- MIME 타입이란?  Multipurpose Internet Mail Extensions의 약자로 간략히 말하자면 파일 변환을 뜻

https://server-talk.tistory.com/183

 

MIME이란 무엇인가?

MIME이란 무엇인가? MIME이란? Multipurpose Internet Mail Extensions의 약자로 간략히 말씀을 드리면 파일 변환을 뜻한다고할 수 있습니다. MIME는 이메일과 함께 동봉할 파일을 텍스트 문자로 전환해서 이메

server-talk.tistory.com

 

resp.setContentType

응답 객체에 콘텐트 타입 지정하기

 response로 setContentType() 메소드를 호출하여 클라이언트에게 응답할 페이지에 대한 환경설정을 결정

 

outputstream

- 바이트 단위의 출력스트림의 최상위 클래스(추상클래스)로서 스스로 객체 생성이 불가능하다.

- 버퍼, 파일, 네트워크 단으로 데이터를 내보내는 기능을 주로 수행한다.** 버퍼란?

- 데이터가 목적지로 보내지기 전에 머무는 곳이다.

- 입력버퍼와 출력버퍼가 있으며, 출력스트림은 기본적으로 flush() 명령이 떨어지기 전까지는 출력버퍼에서 목적지로 데이터가 전달되지 않는다.

- 하지만, 일반적으로는 자동으로 flush 메서드를 호출하도록 구현되어있다.

- 버퍼를 사용하는 장점 : 데이터를 모아서 전송하기 때문에 속도 측면에서 뛰어나다.

 

FileInputStream

- InputStream을 상속하여 구현한 자식 클래스로 하드 디스크 상에 존재하는 파일로부터 바이트 단위의 입력을 처리하는 클래스

- 즉, 출발 지점과 도착 지점을 연결해주는 스트림을 생성하는 클래스이다.

- 파일이 존재하지 않을 경우 FileNotFoundException 예외를 처리해야한다. (Output은 안해도 되는데, 왜일까?)

- 생성자의 인자로는 File 객체나 String 객체를 넘겨준다.

 

2. 클래스패스로 이미지출력

@WebServlet("/image3.do")
public class ImageStreamingServlet3 extends HttpServlet {
	// ServletContext는 한 어플리케이션 내에서 싱글톤으로 관리됨
	private ServletContext application; // ServletContext는 어플리케이션 전체에서 싱글톤 객체. 몇 번 꺼내든 모두 동일

	@Override
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
		application = getServletContext();
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String srcPath = "/kr/or/ddit/images/cat1.jpg"; // 클래스패스
		String filePath = this.getClass().getResource(srcPath).getFile();// 파일시스템상의 절대경로를 받아드리겟다.
		//클래스패스경로일때 이렇게 해야함!!
		
		File source = new File(filePath);
		InputStream is = ImageStreamingServlet.class.getResourceAsStream(srcPath);
		FileInputStream fis = new FileInputStream(source);
		OutputStream os = resp.getOutputStream();
		byte[] buffer = new byte[1024];
		int length = -1;
		while ((length = is.read(buffer)) != -1) {
			os.write(buffer, 0, length);
		}
		is.close();
		os.close();
	}
}

   

getResourceAsStream

Class.getResouceAsStream() 메소드가 하는 일은 리소스의 경로를 ClassLoader의 기준에 맞춰서 재조합해준 후에 ClassLoader.getResourceAsStream() 메소드를 호출

 

tis.getClass().getResource("").getPath() 

//classes 폴더에서부터 시작하여 해당파일까지의 절대경로

**클래스패스란?

 자바가상머신의 클래스 탐색경로 

https://velog.io/@ym1085/Chapter-03

 

[Java] 클래스 패스, 패키지, 접근 수준 지시자

클래스 패스, 패키지, 접근 수준 지시자에 대해 정리 해보자.

velog.io

 

 

3.WEB-INF로 이미지출력

//왜 ? http://localhost/WebStudy01/image.do로 안가는지. ..? 

@WebServlet("/image.do")
public class ImageStreamingServlet extends HttpServlet {
	// ServletContext는 한 어플리케이션 내에서 싱글톤으로 관리됨
	private ServletContext application; // ServletContext는 어플리케이션 전체에서 싱글톤 객체. 몇 번 꺼내든 모두 동일

	/**
	 * ServletContext ? 톰캣 컨테이너 실행 시 각 context(web app)마다 한개의 servletcontext 객체를 생성
	 * 그리고 톰캣이 종료하면 servletcontext객체 역시 소멸 - 서블릿과 컨테이너 간의 연동을 위해 사용한다. - 서블릿끼리 데이터
	 * 공유하는데 사용
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
		application = getServletContext();
	}

	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String webPath = "/WEB-INF/inner/cat1.jpg";// 웹. url, uri 상대 절대
		// WEB-INF 폴더의 경우 브라우저에서 직접적으로 접근이 불가한 경로

		String mime = application.getMimeType(webPath);
		// getMimeType : 지정한 파일의 MIME타입을 리턴한다.
		// MIME ? Multipurpose Internet Mail Extensions의 약자로 간단히 말하면 파일 변환을 의미
	

		resp.setContentType(mime);
		// setContentType 메소드는 html의 표준 MIME 타입인 "text/html" 의 변경이나 캐릭터의 인코딩을 재 지정하고자 할때
		// 사용합니다

		InputStream is = application.getResourceAsStream(webPath);
		// https://lannstark.tistory.com/34
		OutputStream os = resp.getOutputStream();

		byte[] buffer = new byte[1024];

		int length = -1;

		while ((length = is.read(buffer)) != -1) {
			os.write(buffer, 0, length);
		}
		is.close();
		os.close();
	}
}

   https://velog.io/@aerirang647/MIME-type%EC%9D%B4%EB%9E%80

 

MIME type이란?

MIME 이란?Multipurpose Internet Mail Extensions의 약자로 간단히 말하면 파일 변환을 의미한다.현재는 웹을 통해 여러 형태의 파일을 전달하는데 사용하고 있지만 이 용어가 생길 땐 이메일과 함께 동봉

velog.io