학원/복기
[Servlet] 이미지 파일로 응답하기 위한 서블릿 만들기
조가루
2023. 6. 15. 23:48

클라이언트 요청에 의해 이미지 파일로 응답하기 위한 서블릿
[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();//파일 입력 스트림 제거
}
}
