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