본문 바로가기

학원/복기

[Servlet] 이미지 파일로 응답하기 위한 서블릿 만들기

Koala.jpg 파일 넣기


클라이언트 요청에 의해 이미지 파일로 응답하기 위한 서블릿

 

[service 메소드 내부]

 

 

1. 클라이언트에게 이미지 파일이 응답되도록 응답파일의 타입을 변경한다.

→  응답파일이 문서파일이 아니므로 캐릭터셋을 설정하지 않는다.

response.setContentType("image/jpeg");

 

2. 응답파일을 생성하기 위한 출력스트림을 반환받아 저장한다.

→ 이미지 파일(이진 파일 : Binary File)를 생성하기 위해 원시데이터(1Byte)를 전달하는 ServletOutputStream 객체를 반환받는다. 

ServletOutputStream out=response.getOutputStream();

 

3. 서버에 저장된 이미지 파일의 시스템 경로를 반환받아 저장한다.

(파일의 위치를 알아야 파일을 읽어들일 수 있는 입력스트림을 만들 수 있기 때문에)

 

HttpServletRequest.getServletContext() : Servlet 객체를 반환하는 메소드

→ Servlet 객체 : 웹자원(WebContext)을 관리하기 위한 객체이다. (일종의 WAS)

ServletContext.getRealPath(String contextPath) : 매개변수로 전달받은 웹자원의 파일 시스템 경로를 반환하는 메소드

String imageFilePath=request.getServletContext().getRealPath("/WEB-INF/Koala.jpg");

 

 

4. 매개변수에 이미지 파일의 파일 시스템 경로를 제공하여 파일 입력스트림(FileInputStream 객체)을 생성한다.

FileInputStream in=new FileInputStream(imageFilePath);

 

5. 입력스트림으로 원시데이터를 읽어와 출력스트림으로 전달한다. (반복처리)

→ 서버에 저장된 이미지 파일을 클라이언트에게 전달하여 응답한다.

while(true) {
	int readByte=in.read();
	if(readByte==-1) break;
	out.write(readByte);
}

 

6. 파일 입력 스트림 제거

in.close();//파일 입력 스트림 제거

[전체 소스코드]

package xyz.itwill.servlet;

import java.io.FileInputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//클라이언트 요청에 의해 이미지 파일로 응답하기 위한 서블릿
@WebServlet("/image.itwill")
public class SendimageServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//클라이언트에게 이미지 파일이 응답되도록 응답파일의 타입을 변경
		response.setContentType("image/jpeg");
		
		//응답파일을 생성하기 위한 출력스트림을 반환받아 저장
		ServletOutputStream out=response.getOutputStream();
		
		//서버에 저장된 이미지 파일의 시스템 경로를 반환받아 저장
		String imageFilePath=request.getServletContext().getRealPath("/WEB-INF/Koala.jpg");//최상위 경로는 webapp
		//System.out.println("imageFilePath = "+imageFilePath);
		
		//매개변수에 이미지 파일의 파일 시스템 경로를 제공하여 파일 입력스트림(FileInputStream 객체) 생성
		FileInputStream in=new FileInputStream(imageFilePath);
		
		//입력스트림으로 원시데이터를 읽어와 출력스트림으로 전달 - 반복 처리 
		while(true) {
			int readByte=in.read();
			if(readByte==-1) break;
			out.write(readByte);
		}
		
		in.close();//파일 입력 스트림 제거 
	}

}