생각하는 감쟈

[JAVA] 파일_02 : File_Download Form 본문

Language/Java

[JAVA] 파일_02 : File_Download Form

생각하는 감쟈🥔 2024. 6. 7. 12:25



 

 

FileUpload

package kro.or.ddit.upload.controller;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

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

import kr.or.ddit.vo.FileInfoVO;
import kro.or.ddit.upload.service.FileInfoServiceImpl;
import kro.or.ddit.upload.service.IFileInfoService;

/*
	- Servlet 3.0이상에서는 파일 업로드를 처이하기 위해서는 서블릿에 @MultipartConfig 애노테이션을 설정해야 한다.
	    
	- @MultipartConfig 애노테이션에서 설정할 변수들 ...
		1) location : 업로드한 파일이 임시적으로 저장될 경로 지정(기본 값 : "" >> 시스템의 기본 임시 저장소 )
		2) fileSizeThreshold : 이 곳에 지정한 값 보다 큰 파일이 전송되면 location에 저장한 임시 디렉토리에 저장한다.
								( 단위 : Byte, 기본값 : 0 (무조건 입시 디렉토리에 저장))
		3) maxfileSize : 1개의 파일의 최대 크기( 단위 : Byte, 기본값:-1L( 무제한))
		4) maxRequestSize : 서버로 전송되는 요청(request)데이터 전체의 최대 크기( 단위 : Byte, 기본 값: -1L(무제한))
							(모든 파일의 크기 + formData크기)

*/


@MultipartConfig(
			fileSizeThreshold = 1024 * 1024 * 10, maxFileSize = 1024 * 1024 * 30,
			maxRequestSize = 1024 * 1024 * 200
		
		)
@WebServlet("/file/fileUpload.do")
public class FileUpload extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//Get방식으로요청하면 FileUpload 홈 페이지로 이동한다.
		
		request.getRequestDispatcher("/fileupload/fileupload.jsp")
		.forward(request, response);
		
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// POSt방식으로요청하면 Upload된 파일을 받아서 처리한다.
		request.setCharacterEncoding("utf-8");
		
		// 업로드된 파일들이 저장될 폴더 설정
		String uploadPath = "d:/d_ither/uploadFiles";
		
		// 저장될 폴더가 없으면 새로 만들ㅇ러준다.
		File file = new File(uploadPath);
		if(!file.exists()) {
			file.mkdirs();
		}
		
		// 파일이 아닌 일반 데이터는 Request객체의 getParameter()메서드나 getParameterValues()메서드를 이용해서 구한다
		String userName = request.getParameter("username");
		System.out.println("일반 파라미터 데이터 : " + userName);
		
		//--------------------------------------------------------
		// 수신 받은 파일 데이터 처리하기
		
		// 수신 받은 파일이 여러개이면 이 파일들의 정보를 저장할 List객체가 필요하다.
		List<FileInfoVO> fileList = new ArrayList<FileInfoVO>();
		
		/*
		 	-Servlet 3.0이상에서 파일 처리를 위해 새롭게 추가된 메서드
		 		1) Request객체.getParts(); >> 전체 Part객체를 Collection객체를 담아서 반환한다.
		 		2) Request객체.getPart("part이름")
		 			>> 지정된 'part이름'을 가진 개별 Part객체를 반환한다.
		 			>> 'part이름' 은 <form> 태그 안의 입력요소의 name 속성값으로 구별한다.
		 		
		 */
		
		 for(Part part : request.getParts()) {
	         String fileName = extractFileName(part);   // Upload한 파일명 구하기
	         
	         // 찾은 파일명이 빈문자열("")이면 이것은 파일이 아닌 일반 파라미터라는 의미이다.
	         if(!"".equals(fileName)) {   // 파일인지 검사
	            
	            // 1개의 파일 정보를 저장할 FileInfoVO객체 생성
	            FileInfoVO fvo = new FileInfoVO();
	            
	            fvo.setFile_writer(userName);         // 작성자를 VO에 저장
	            fvo.setOrigin_file_name(fileName);   // 실제 파일명을 VO에 저장
	            
	            // 실제 저장되는 파일 이름이 중복되는 것을 방지하기 위해서 UUID를 이용하여 저장할 파일명을 만든다.
	            String saveFileName = UUID.randomUUID().toString() + "_" + fileName;
	            
	            fvo.setSave_file_name(saveFileName);   // 저장 파일명을 VO에 저장
	            
	            // part.getSize()메소드 ==> upload된 파일의 크기를 반환한다. (단위 : byte)
	            
	            // byte단위의 파일 크기를 KB단위로 변환해서 VO에 저장한다.
	            fvo.setFile_size((long)(Math.ceil(part.getSize() / 1024.0)) );
	            
	            try {
	               // Part객체.write()메소드 ==> upload된 파일을 저장하는 메소드
	               // 형식) Part객체.write("저장할 경로" + "저장할 파일명")
	               part.write(uploadPath + file.separator + saveFileName); // 파일저장하기 
	            } catch (Exception e) {
	               e.printStackTrace();
	            }
	            
	            fileList.add(fvo);      // List에 1개의 파일정보를 추가한다.
	         } // if문 끝...
	         
	      } // for문 끝...
	      
	      IFileInfoService service = FileInfoServiceImpl.getInstance();
	      
	      // List에 저장된 파일 정보들을 DB에 저장한다.
	      for(FileInfoVO fvo : fileList) {
	         service.insertFileInfo(fvo);
	      }
	      
	      // 모든 작업이 완료되면 파일 목록을 보여주는 페이지로 이동한다. ==> redirect방식으로 이동한다.
	      response.sendRedirect(request.getContextPath() + "/file/fileList.do");
	      
	      
	   } // doPost()메소드 끝...

	
	//-------------------------------------------------
	/*
	 	Part의 구조
	 	
	 	1) 파일이 아닌 일반 파라미터 데이터일 경우
	 	-------------------------------------23adfalk32lksd  	>> 각 park를 구분하는 구분 선
	 	content-disposition : form-data; name ="username"	>> 파라미터 명
	 														>> 빈줄
	 	이순신 												>> 파라미터 값
	 	
	 	
	 	2) 파일일 결루
	 	-------------------------------------23adfalk32lksd  	>> 각 park를 구분하는 구분 선
	 	content-disposition : form-data; name ="upFile1"; filename="test1.txt"	>> 파일 정보
	 	content-type : text/plain							>> 파일 종류
	 														>> 빈줄
	 	12345asdf안녕하세요									>> 파일 내용
	 	
	 	
	 */
	
	
	
	
	//Part구조 안에서 파일명을 찾아서 반환하는 메서드
	   private String extractFileName(Part part) {
		      String fileName = "";      // 반환값이 저장될 변수
		      
		      String dispositionValue = part.getHeader("content-disposition");
		      String[] items = dispositionValue.split(";");
		      for(String item : items) {
		         if(item.trim().startsWith("filename")) {   // 파일 정보가 있는지 검사
		            fileName = item.substring(item.indexOf("=") + 2, item.length() - 1);
		         }
		      }
		      
		      return fileName;
		   }


}

 

 

 

FileDownload

package kro.or.ddit.upload.controller;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

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

import kr.or.ddit.vo.FileInfoVO;
import kro.or.ddit.upload.service.FileInfoServiceImpl;
import kro.or.ddit.upload.service.IFileInfoService;

@WebServlet("/file/fileDownload.do")
public class FileDownload extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		
		// 업로드된 파일들이 저장될 폴더 설정
		String uploadPath = "d:/d_ither/uploadFiles";
				
		// 저장될 폴더가 없으면 새로 만들어준다.
		File file = new File(uploadPath);
		if(!file.exists()) {
			file.mkdirs();
		}
		
		//------------------------------------------------
		
		//파라미터로 넘어온 파일번호를 받는다
		String strFileNo = request.getParameter("fileno");
		int fileNo = Integer.parseInt(strFileNo);
		
		//파일 번호를 잉요하여 DB에서 해당 정보를 가져온다
		
		IFileInfoService service = FileInfoServiceImpl.getInstance();
		
		FileInfoVO fvo = service.getFileinfo(fileNo);
		response.setCharacterEncoding("utf-8");
		
		// 다운 받을 파일 저보를 갖는 File객체를 생성한다. >> 실제 저장된 파일명을 지정하여 생성한다.
		File downFile = new File(file, fvo.getSave_file_name());
		
		if(downFile.exists()) { // 다운 받을 파일이 있을 때...
			// Content Type 설정
			response.setContentType("application/octet-stream; charset=utf-8");
			
			//-------------------------------------------- 시작...
			// response객체의 Header에 content-disposition 헤더 정보 설정
			String headerKey = "content-disposition";
			
			// 이 헤더에는 다운로드 받을 때 클라이언트에 저장될 파일 이름을 지정한다. (한글이 포함되어 있을 경우)
			String headerValue = "attachment; filename*=UTF-8''" + 
					URLEncoder.encode(fvo.getOrigin_file_name(), "utf-8")
							  .replaceAll("\\+", "%20"); // \\+ >> 공백
			response.setHeader(headerKey, headerValue);
			// -------------------------------------------- 끝...
			
			// 이 이후의 작업은 서버에 저장된 파일을 읽어서 클라이언트에게 보내 준다. (일종의 입출력 작업)
			BufferedOutputStream bout = null;
			BufferedInputStream bin = null;
			
			try {
				// 출력용 스트림 객체 생성
				bout = new BufferedOutputStream(response.getOutputStream());
				
				// 파일 입력용 스트림 객체 생성
				bin = new BufferedInputStream(new FileInputStream(downFile));
				
				byte[] temp = new byte[1024];
				
				int len = 0;
				while((len = bin.read(temp)) > 0) {
					bout.write(temp, 0, len);
					
				}
				
				bout.flush();
				
			} catch (Exception e) {
				System.out.println("입출력 오류 : " + e.getMessage());
			}finally {
				if(bout!=null) try {bout.close();} catch(IOException e) {}
				if(bin!=null) try {bin.close();} catch(IOException e) {}
			}
			
			
		}else { // 다운 받을 파일이 없을 때...
			response.setContentType("test/html; charset=utf-8");
			response.getWriter().println("<h3>" 
						+ fvo.getOrigin_file_name() + "파일이 존재하지 않습니다.</h3>");
			
		}
		
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

FileDownload

 

 


 

fileMain.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href ="<%= request.getContextPath()%>/file/fileList.do"> 파일 목록 보기</a>

</body>
</html>

 

 

 

fileList.jsp

 

다운로드 코드 추가

<td><a href="<%=request.getContextPath()%>/file/fileDownload.do?fileno=<%=fvo.getFile_no()%>"> DownLoad </a></td>

 

 

<%@page import="kr.or.ddit.vo.FileInfoVO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<%
	//컨트롤러 (서블릿)에서 보내온 자료 받기
	List<FileInfoVO> fileList = (List<FileInfoVO>)request.getAttribute("fileList");

	

%>


<body>
<h2> 전체 파일 목록</h2> <br><hr><br>

<a href="<%=request.getContextPath()%>/file/fileUpload.do"> 파일 업로드</a>

<table border="1">
<thead>
	<tr>
		<th>번호</th><th> 작성자</th> <th>저장파일명</th><th>원래의 파일명</th>
		<th>파일크기</th><th>날짜</th><th>비고</th>
	<tr>
</thead>
<tbody>
<%
	if(fileList == null || fileList.size() == 0){
%>
	<tr>
		<td colspan="7"> Upload한 파일 목록이 하낟 없습니다</td>
	</tr>

<% 		
	}else {
		for(FileInfoVO fvo : fileList){
%>	
	<tr>
		<td><%=fvo.getFile_no() %></td>
		<td><%=fvo.getFile_writer() %></td>
		<td><%=fvo.getSave_file_name() %></td>
		<td><%=fvo.getOrigin_file_name() %></td>
		<td><%=fvo.getFile_size() %></td>
		<td><%=fvo.getFile_date() %></td>
		<td><a href="<%=request.getContextPath()%>/file/fileDownload.do?fileno=<%=fvo.getFile_no()%>"> DownLoad </a></td>
	</tr>
<%		
		}
	}

%>
</tbody>

</table>
</body>
</html>

 

 

File Upload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2> File Upload 연습용 Form</h2>
<form action = "<%=request.getContextPath()%>/file/fileUpload.do"
	  method="post" enctype="multipart/form-data">
	작성자 이름 : <input type="text" name="username"> <br><br>
	한 개의 파일 선택 : <input type="file" name="upFile1"> <br><br>
	여러 개의 파일 선택 : <input type="file" name="upFile2" multiple> <br><br>
	
	<input type="submit" value="전송">
	
</form>
<br><hr><br>
<a href="<%=request.getContextPath()%>/file/fileUpload.do">파일 목록 보기</a>
</body>
</html>

 

 

 

출력화면

 

 

 

'Language > Java' 카테고리의 다른 글

[JAVA] SVN. 설치 및 사용  (0) 2024.06.10
[JQuery] 게시판 만들기_02  (0) 2024.06.05
[JAVA] 파일_01 : File_Upload Form  (0) 2024.06.05
[JAVA] $.ajax - LprodTest (Ajax / Non Ajax)  (0) 2024.06.05
[JQuery] 메뉴판 만들기_01  (1) 2024.06.04
Comments