본문 바로가기

대덕공부/Spring

ImageStreaming


package kr.or.ddit.servlet02;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * E://contents/cat1.jpg 파일을 중계하는 서블릿. 
 * 이미지 파일을 읽고(input),
 * stream copy
 * 스트리밍 컨텐츠로 출력(output)
 * Content-Type(MIME) 설정 필요.
 * 1. source 확보 (E://contents/cat1.jpg)
 * 2. source대상 input 스트림 개방
 *      FileInputStream
 * 3. destination 확보 (response)
 * 4. dest 대상 output 스트림 개방
 *      response.getOutputStream
 * 5. in/out stream copy
 * 
 * 
 */
/**
 * 서버측에서 클라이언트의 요청을 처리할때 주의할 점.
 * ** 클라이언트의 모든 요청 데이터에 대해 검증이 필요함.
 * 1) 요청 파라미터
 * 2) 요청 헤더
 * 3) 요청 데이터에 의해 파생되는 데이터  
 */
 
@WebServlet("/02/streaming.do") // URI
public class ImageStreamingServlet 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 folderPath = "D:\\contents";
     File folder = new File(folderPath);
      
     String imageName = req.getParameter("image");
     
     if(imageName==null|| imageName.isEmpty() ) {
    	 resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "필수 파라미터 누락");
    	 return;
     }
     
     File image = new File(folder, imageName);
     if(!image.exists()) {
    	 resp.sendError(HttpServletResponse.SC_NOT_FOUND, "해당파일은 존재하지 않음");
    	 return;
     }
     
      String mime = application.getMimeType(image.getName());
      resp.setContentType(mime);
      FileInputStream fis = new FileInputStream(image);
      
      //앞에 슬러시 있으면 절대경로 없으면 상대경로라고 부른다
      
      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();
   }
}
<%@page import="java.util.LinkedHashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.io.File"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!--     View 역할? -->
<!--     1) UI 생성 : (model 확보, Controller가 사용한 scope에 저장된 model) -->
<!--     2) 응답 전송 -->

<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"
	integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
	crossorigin="anonymous"></script>
</head>
<body>
	<%
  	 StringBuffer options = (StringBuffer) request.getAttribute("options");
   %>
	<h4>이미지 선택</h4>
	<form action="<%=request.getContextPath() %>/02/streaming.do"
		id=imageForm>
		<!--이주소로 매핑걸려있는 서블릿필요  -->
		<select name="image">
			<%=options %>
		</select> <input type="submit" value="전송">
	</form>
	<div id="imageArea"></div>
	<script>
      let selectTag = $("select[name='image']").on("change",function(){
         $(this.form).trigger("submit");
         $(this.form).submit();
      });
         let imageArea = $("#imageArea");
      const SRCPTRN = "<%=request.getContextPath() %>/02/streaming.do?image=%v";
      $("#imageForm").on("submit", function(event){
      event.preventDefault();
         //<img src="./streaming.do?image=%v"/>
         let imageName = $(this.image).val();
         let imgTag = $("<img>").attr("src", SRCPTRN.replace("%v", imageName));
         imageArea.html(imgTag);
      return false;
   });
    </script>
</body>
</html>​
package kr.or.ddit.servlet03;

import java.io.File;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Model2 + MVC
 * Controller 역할 ?
 * 1) request 수령(command 수령).
 * 2) 처리 -> 결과 데이터(Model)
 * 3) model을 view로 전달(공유, controller와 view가 같은 model을 공유함)
 * 4) view로 이동.
 */

@WebServlet("/03/model2ImageForm.do")
public class Model2ImageFormServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		ServletContext application = getServletContext();
		String folderPath ="D:\\contents";
		File folder = new File(folderPath);
		File[] children = folder.listFiles((dir,name)->{
			String mime = application.getMimeType(name);//지정한 파일의 MIME 타입을 return
			return mime!=null && mime.startsWith("image/");
			});
		
		String pattern = "<option>%s</option>";
		StringBuffer options = new StringBuffer();
		for(File tmp : children) {
			options.append(String.format(pattern,tmp.getName()));
		}
		req.setAttribute("options", options);
		String view ="/WEB-INF/views/imageStreamingView.jsp";
		req.getRequestDispatcher(view).forward(req, resp);
	}
	
	
}

 

>> Model2ImageFormServlet 실행

>> req.getRequestDispatcher로 인해 imageStreamingVeiw.jsp로 이동

>> action="<%=request.getContextPath() %>/02/streaming.do 으로 인해 streaming.do로 이동해 이미지 가공처리 

 

 

'대덕공부 > Spring' 카테고리의 다른 글

get방식 vs post방식 참고**  (0) 2022.06.08
Header && Enumeration  (0) 2022.06.08
Servlet - 생명주기  (0) 2022.06.02
WAS에 서블릿 등록  (0) 2022.06.02
서블릿과 서블릿컨테이너  (0) 2022.06.02