Web File Upload

file 업로드 & 서버에서 불러오기

이전 자료실과 비슷한 내용이지만 세미 프로젝트를 하면서 이미지파일을 서버 파일에 올려두고 경로를 접근하여 불러오는 내용을 기록

파일 업로드 하는 부분

<form action="addPro" method="post" enctype="multipart/form-data">  <-- 보내주는 방식이 중요 -->
	<ul>
		<li>제품명<br><input type="text" name="p_name"></li>
		<li>원단(재료)<br><input type="text" name="p_material"></li>
		<li>제조 국가<br><input type="text" name="p_madeIn"></li>
		<li>가격<br><input type="number" name="price"></li>
		<li>카테고리 분류<br>
			<select id="selbig" name="selbig">
				<option>대분류</option>
				<option value="top">상의</option>
				<option value="bottom">하의</option>
				<option value="shoes">신발</option>
				<option value="accessary">악세사리</option>
			</select>
			<select id="selsmall" name="selsmall">
				<option>소분류</option>
			</select>
		</li>
		<li>이미지 파일<br><input type="file" name="fileload"></li>
		<li>제품 정보<br><textarea rows="10" cols="100" name="p_info"></textarea></li>
	</ul>
	<input type="submit" value="제품 추가">
	</form>
  • form 으로 감싼 내용들을 보내는 방식으로 진행하였다. 여기서 input type=”file” 방식이 파일을 올리고 보내는 부분
  • form의 보내는 방식 중 multipart/form-data로 보내야 파일까지 같이 보내진다.

Servlet 으로 보내준다

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		
		ProductDetailDao dao = ProductDetailDao.getInstance();
		
	
			String savePath = req.getServletContext().getRealPath("/productimg");   // 실제 파일이 저장될 경로를 잡아준다
			System.out.println(savePath);
			int sizeLimit = 1024*1024*15;     //저장될 파일의 크기 제한을 잡아준다
			String encoding = "UTF-8";        // 저장될 파일의 인코딩 설정
			
      //   아까 form으로 multipart로 보내주는것을 받아준다 
      //                                           request, 경로, 파일 크기, 인코딩설정, 중복파일 방지 기능
			MultipartRequest multi = new MultipartRequest(req, savePath, sizeLimit, encoding, new DefaultFileRenamePolicy());		
			
			
			String name = multi.getParameter("p_name");
			String mertiral = multi.getParameter("p_material");
			String madeIn = multi.getParameter("p_madeIn");
			int price = Integer.parseInt(multi.getParameter("price"));
			String category = multi.getParameter("selbig");
			String kind = multi.getParameter("selsmall");
			int p_kind = Integer.parseInt(kind);
			String info = multi.getParameter("p_info");
			
			String filename = multi.getFilesystemName("fileload");  // 파일의 이름만 받아준다.
			
			String fileFullPath = savePath + "/" + filename;
			
			System.out.println(name+" "+mertiral+" "+madeIn+" "+price+" "+category+" "+kind+" "+fileFullPath+" "+info+" ");
			
			ProductDto dto = new ProductDto(name, info, mertiral, madeIn, price, category, p_kind, filename); // 받은 값들을 객체에 넣어준다(이미지 파일과 묶기위해)
			boolean isS = dao.insertProduct(dto); // DB에 넣어줌
			req.setAttribute("insert", isS);
		
			forward("addPAF.jsp", req, resp);
		
	}
	public void forward(String linkname, HttpServletRequest req, HttpServletResponse resp) {
		RequestDispatcher dispatcher = req.getRequestDispatcher(linkname);
		try {
			dispatcher.forward(req, resp);
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
  • 파일의 이름을 객체 (dto)에 넣어주고 파일을 불러올때 DB에 접근하여 파일 이미지 이름 값만 추출하면 된다

등록 여부 확인

boolean isS = (boolean)request.getAttribute("insert");
if(isS){
	%>
	<script type="text/javascript">
		alert("등록되었습니다");
		location.href="addPro?work=list";
	</script>
	<%
}else{
	%>
	<script type="text/javascript">
		alert("등록 실패");
		location.href="addProduct.jsp";
	</script>	
	<%
}
  • 확인 후 다시 컨트롤러에 보내준다.(이때 기본값인 get 방식으로 값들을 넘겨준다)

다시 servlet

	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String work = req.getParameter("work");
		ProductDetailDao dao = ProductDetailDao.getInstance();
		List<ProductDto> list = new ArrayList<ProductDto>();
		if(work.equals("list")) {
			list = dao.getProductList("all");
			req.setAttribute("list", list);
			forward("productList.jsp", req, resp);
		}
	}
  • 리스트에 아까 값들을 받은 객체들을 넣어준다. 그리고 서버에 저장된 이미지를 뿌려주기 위해 다시 view로 간다.

이미지 list view

<%
List<ProductDto> list = (List<ProductDto>)request.getAttribute("list");
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>제품</h1>
<%
for(int i = 0; i < list.size(); i++){
	ProductDto pro = list.get(i);
	%>
		<a href="productDetail?work=product&seq=<%=pro.getSeq() %>">
		<img alt="이미지 없음" src="productimg/<%=pro.getFilename()%>" width="300px" height="300px"></a>
	<%
}
%>
  • 태그에 src 경로를 아까 저장 경로로 설정하였던 곳으로 지정하고 파일 이름을 db에 접근하여 불러온다.