웹_프론트_백엔드/JAVA프레임윅기반_풀스택

2020.05.28

shine94 2020. 5. 28. 09:06

1. GitHub 협업자(Collaborator) 추가

 : 협업자 등록할 해당 Repositories 클릭 > Settings 클릭

> Manage access 클릭 > 협업자 등록 페이지로 이동

> Invite a collaborator 클릭 > 원하는 협업자 검색(GitHub 회원일 경우 바로 검색 뜸)

> Add binnapark to Project_Alpha 클릭

> 협업자 추가 완료...!!

 

 

2. 협업자(Collaborator)

 : 협업자 등록이 되면 초대 메일이 옴

> GitHub 로그인 된 상태에서 초대장을 타고 들어가면 초대 동의하는지 물어보는 창이 뜸 > Accept invitation 클릭

> 초대된 Repositories를 확인할 수 있음

 

 

3. 협업자(Collaborator), Workspace Clone하기

 : 우클릭 > import 클릭 > Git > Projects from Git(with smart import) 선택 후 Next 클릭

> Clone URI 선택 후 Next 선택 > 빨간 표시한 항목 채운 뒤 Next 클릭

> master 선택 후 Next 클릭 > Directory에 Clone할 WorkSpace 선택 후 Next 클릭

> Finish 클릭하면 프로젝트가 Clone된 것을 볼 수 있다..!!

 

 

4. 에러 해결(Build Path 문제)

 : 프로젝트 우클릭 > Build Path > Configure Build Path... 클릭

> Java Build Path의 Libraries 에서 add Library... 선택

> Server Runtime 선택 > 아까 만들었던 서버 선택 후 Finish 클릭

> ApacheTomcat v9.0 [Server_a] 가 생기면 에러가 해소됨 

 

 

5. 등록된 협업자도 commit 가능

 

 

6. 웹에서 파일 업로딩하기 위해 고려해봐야 하는 것들
1) 어디에 저장할 것인가?


2) 중복 이름은 어떻게 처리할 것인가?

 : 원본이름, 저장이름 기억해야함

 

3) 다운 받을때는 어떤 이름이어야 할지?

 

4) 정해진 규격의 파일만 업로드 처리

 

 

7. 파일 업로딩 구현 방법
1) Servlet 3.x를 이용한 파일 업로딩 방법(매우 복잡)


2) 외부 라이브러리를 이용한 파일 업로딩 방법

 

 

8. 외부 라이브러리를 사용하여 파일 업로딩 구현하기

1) COS 라이브러리 다운받기

 : www.servlets.com > com.oreilly.servlet 클릭 > cos-20.80.zip 다운

> 다운로드 받은 파일 중 cos.jar 파일을 이클립스 WebContent > lib에 복사하기

2) 파일 업로드될 폴더를 만들기

 : tomcat 폴더 안에 만들기

 

 

9. multipart 

 : 기존의 parameter 데이터는 name:value 쌍들로만 구성된 단일 part였지만 
   multipart는 성격이 다른 데이터를 여러 part로 나누어서 서버로 전송된다.  
   파일 업로딩이 있는 경우,  parameter 데이터 뿐 아니라 파일의 개수만큼 여러 part로 쪼개어지기 때문에
   반드시 multipart 로 전송해야 하고, 이에 대한 처리가 필요하다.

 

 

10. 파일 업로드 할 때

1) <input type="file">

 

2) POST 방식으로 전송(GET 방식 불가!!) 


4) <form enctype=”multipart/form-data”>

 

 

11. JSP20_FileUpload

** FileUploadForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>파일업로드 FORM</title>
</head>
<body>
<h2>파일업로드 FORM</h2>
<form action="FileUpload.jsp" method="post" 
	enctype="Multipart/form-data">
	<hr>
	이름: <input type="text" name="name"><br>   <%-- part: parameters --%>
	제목: <input type="text" name="title"><br>
	<hr>	
	파일1: <input type="file" name="file1"><br> <%-- part: file1 --%>
	<hr>
	파일2: <input type="file" name="file2"><br> <%-- part: file2 --%>
	<br>
	<input type="submit" value="전송"/>
</form>
</body>
</html>

 

** FileUpload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<!-- cos 라이브러리 -->
<%@ page import="com.oreilly.servlet.MultipartRequest" %>
<%@ page import="com.oreilly.servlet.multipart.FileRenamePolicy" %>
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>

<%-- parameter 값들, file 값들 추출 --%>
<%@ page import="java.util.Enumeration" %>

<%--File 객체 --%>
<%@ page import="java.io.File" %>

<%-- 이미지 파일 다루기 --%>
<%@ page import="java.awt.image.BufferedImage" %>
<%@ page import="javax.imageio.ImageIO" %>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>파일 업로드 결과</title>
</head>
<body>

<form action="FileCheck.jsp" method="post" name="fileCheck">
<%
	// MultipartRequest 객체 생성 준비
	String saveDirectory = "C:\\tomcat\\upload";

	System.out.println("업로드경로 : " + saveDirectory);
	
	int maxPostSize = 5 * 1024 * 1024;	// post 받기, 최대 크기 5MB 
	String encoding = "utf-8";	// 인코딩
	FileRenamePolicy policy = new DefaultFileRenamePolicy();	// 업로딩 파일 이름 중복에 대한 rename 정책
	
	MultipartRequest multi = null;
	
	try {	// jsp 파일에서 예외를 반드시 catch할 필요는 없다!
		
		// MultipartRequest 생성 단계에서 이미 파일은 저장됨!
		multi = new MultipartRequest(
				request /* JSP 내부 객체 request */
				, saveDirectory /* 업로드된 파일 저장 경로 */
				, maxPostSize /* 최대 파일 크기(post 크기) */
				, encoding	
				, policy /* 중복 이름의 파일 rename 객체 */
				);
	
		Enumeration names = null;
		
		// 1. Parameter name들 추출
		names = multi.getParameterNames();  // 일반 form parameter name들 추출
		
		while(names.hasMoreElements()) {
			String name = (String)names.nextElement();  // name
			String value = multi.getParameter(name);	// value
			out.println(name + " : " + value + "<br>");
		} // end while()
		out.println("<hr>");
		
		// 2. File 들 추출
		names = multi.getFileNames();	// type="file" 요소, name들 추출
		while(names.hasMoreElements()) {
			String name = (String)names.nextElement();
			out.println("input name: " + name + "<br>");
			
			// 위 name 의 '업로드 원본 파일명'을 가져온다.
			String originalFileName = multi.getOriginalFileName(name);
			out.println("원본파일 이름: " + originalFileName + "<br>");
			out.println("<input type='hidden' name='originalFileName' value='" + originalFileName + "'");
			
			// 서버 시스템에 '저장된 파일명' 을 가져온다.
			String fileSystemName = multi.getFilesystemName(name);
			out.println("파일시스템 이름: " + fileSystemName + "<br>");
			out.println("<input type='hidden' name='fileSystemName' value='" + fileSystemName + "'");
			
			// 업로딩된 파일의 타일 : MIME 타입 (ex: image/png ...)
			String fileType = multi.getContentType(name);
			out.println("파일타입: " + fileType + "<br>");
			
			// 문자열 '파일이름'이 name에 들어온 상태
			// 문자열 파일 이름을 통해 실제 파일 정보를 -> File 객체로 가져 오기
			File file = multi.getFile(name);
			if(file != null) {
				long fileSize = file.length();	// 파일 크기 (byte)
				out.println("파일크기 : " + fileSize + " bytes<br>");
				
				// 이미지 파일 다루기
				BufferedImage bi = ImageIO.read(file);
				if(bi != null) {	// ★★ 이미지 판정 여부로 사용 가능 ★★
					int width = bi.getWidth();
					int height = bi.getHeight();
					out.println("이미지파일 W x H : " + width + " x " + height + "<br>");
					
				} else {
					out.println("이미지가 아닙니다.<br>");
				}
			}
			out.println("<br>");
			
		} // end while()
		
		
	} catch(Exception e) {
		e.printStackTrace();
		out.println("파일 처리 예외 발생<br>");
	}
%>
<input type="submit" value="업로드 파일 확인"/><br>
</form>

</body>
</html>

 

** FileCheck.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ page import="java.net.*" %> <%-- URLEncoding 외 --%>

<%-- JSTL --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<% request.setCharacterEncoding("utf-8"); %>

<%-- parameter 받기 : Java --%>
<%
	String[] originalFileNames = request.getParameterValues("originalFileName");
	String[] fileSystemNames = request.getParameterValues("fileSystemName");
	int cnt = originalFileNames.length;
%>

<%-- parameter 받기 : JSTL --%>
<c:set var="originalFileNames" value="${paramValues.originalFileName }"/>
<c:set var="fileSystemNames" value="${paramValues.fileSystemName }"/>
<c:set var="cnt" value="${fn:length(paramValues.originalFileName) }"/>


<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>

form p {text-decoration: underline;}
form p:hover {cursor: pointer; color: blue;}

</style>
<title>파일 확인 & 다운로드 링크</title>
</head>
<body>

<%-- Java 방식 --%>
<h3><%= cnt %>개의 파일 확인</h3>

<ul>
<%
	for(int i = 0; i < cnt; i ++) {
		out.println("<li>파일: " + (i + 1) + "</li>");
		out.println("<ul>");
		out.println("<li>원본이름: " + originalFileNames[i] + "</li>");
		out.println("<li>파일시스템: " + fileSystemNames[i] + "</li>");
		out.println("</ul>");
	}
%>
</ul>


<%-- JSTL 방식 --%>
<h3>${cnt} 개의 파일 확인</h3>

<c:forEach var="i" begin="0" end="${cnt - 1 }" varStatus="status">
	<li>파일: ${i + 1 }</li>
	<ul>
		<li>원본이름: ${originalFileNames[status.index] }</li>
		<li>파일시스템: ${fileSystemNames[status.index] }</li>
	</ul>
</c:forEach>

<hr>
<%-- GET방식 request시 url 에  한글이나 띄어쓰기 등이 들어가선 안되기 때문에 반드시 URLEncoder 로 처리 해야 한다
X ] http://localhost:8080/JSP18_FileUpload/FileDownload.jsp?fileSystemName=8퍼센트.ipynb
O ] http://localhost:8080/JSP18_FileUpload/FileDownload.jsp?fileSystemName=8%ED%8D%BC%EC%84%BC%ED%8A%B8.ipynb
java.net.URLEncoder  임포트!
--%>
<h3>다운로드 링크1: Get + Java</h3>
<% for(int i = 0; i < originalFileNames.length; i++) { %>
	<%-- 화면에는 원본이름으로, 실제 링크는 업로드된 저장된 이름으로 --%>
	<%
		String fname = URLEncoder.encode(fileSystemNames[i], "utf-8");
		String oname = URLEncoder.encode(originalFileNames[i], "utf-8");
	%>
	<a href="FileDownload.jsp?fileSystemName=<%= fname %>&originalFileName=<%= oname %>">
	<%= originalFileNames[i] %>
	</a>
	<br>
<% } %>

<h3>다운로드 링크2: Post + Java</h3>
<% for(int i = 0; i < originalFileNames.length; i++) { %>
<form name="frm<%= i %>" action="FileDownload.jsp" method="post">
	<input type="hidden" name="fileSystemName" 
		value="<%= fileSystemNames[i] %>"/>
	<input type="hidden" name="originalFileName" 
		value="<%= originalFileNames[i] %>"/>
	<p onclick="document.forms['frm<%=i%>'].submit()">
	<%= originalFileNames[i] %>
	</p>
</form>
<% } %>

<h3>다운로드링크3: post + JSTL</h3>
<c:forEach var="i" begin="0" end="${cnt -1 }">
<form name="ifrm${i }" action="FileDownload.jsp" method="post">
	<input type="hidden" name="fileSystemName"
		value="${fileSystemNames[i] }"/>
	<input type="hidden" name="originalFileName"
		value="${originalFileNames[i] }"/>
	<p onclick="document.forms['ifrm${i }'].submit()">
	${originalFileNames[i]}
	</p>
</form>
</c:forEach>

</body>
</html>

 

** FileDownload.jsp

<!-- 화면에 보이는 용도아 아님, 말 그대로 다운 받는 용도임..!! -->

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ page import="java.net.*" %>
<%@ page import="java.io.*" %>

<% request.setCharacterEncoding("utf-8"); %>

<%
	String fileSystemName = request.getParameter("fileSystemName");
	if(fileSystemName == null) {return;}
	String originalFileName = request.getParameter("originalFileName");
	if(originalFileName == null) {originalFileName = fileSystemName;}
%>

<%
	//파일을 다운로드 할때 파일의 제목이 인코딩에 따라 제목이 깨질수 있다.
	// 따라서 제목 인코딩이 필요하다
		
	// 유형을 파악해야 한다
	//  - FileInputStream : byte stream - 바이너리
	//  - FileReader : char stream  - 문자기반
	
	// 1) 다운로드 받을 파일의 경로및 이름  지정
	// 업로드된 폴더 위치와 업로드 폴더의 이름을 알아야 한다.
	String realPath = "";
	
	// 직접 폴더 지정할 경우
	realPath = "C:\\tomcat\\upload";
	
	System.out.println("downloadPath: " + realPath);
	
	String downloadFilePath = realPath + File.separator + fileSystemName;
	System.out.println("downloadFilePath: " + downloadFilePath);

	// 2) 유형(MIME)확인 - 읽어올 파일의 유형 
	//   -> response 받을 브라우저에서 페이지 생성할때 위 타입정보를 가지고 판단함
	String fileType = getServletContext().getMimeType(downloadFilePath);
	// 유형이 지정되지 않은 경우
	if(fileType == null) {
		fileType = "application/octet-stream";	// 일련의 8-bit 스트림 형식
												// 유형이 알려지지 않은 파일에 대한 읽기 형식 지정
	}
	System.out.println("파일유형(MIME): " + fileType);

	// 3) response 세팅
	// response에 유형(MIME)을 알려준다
	response.setContentType(fileType);
	
	// 원본 파일 이름으로 다운로드 받을 수 있게 처리
	String encFileName = URLEncoder.encode(originalFileName, "utf-8");
	
	// response 헤더에 추가
	response.setHeader("Content-Disposition", "attachment; filename=" + encFileName);
	
	// 4) 클라이언트에 파일 전송하기 전에 내부객체 out 을 clear()
	// JSP 에서 OutputStream 을 이용해서 바이너리나 이미지 등을 스트림으로 전송할 때 밑의 response.getOutputStream() 을 해주기 전에
	// 기본적으로 생성된 내부객체 out 과의 충돌 이 생실수 있으니, 미리 clear() 한다.
	// 충돌 발생시  IllegalStateException 발생
	out.clear();	// out 객체내 출력할 내용들 제거
	out = pageContext.pushBody();  // <-- 커스텀 태그등도 clear 하고 JspWrite(out)에 새로운 body 생성
	
	// 5) File 전송 --> ServletOutputStream
	File srcFile = new File(downloadFilePath);
	FileInputStream in = new FileInputStream(srcFile);
	ServletOutputStream sout = response.getOutputStream();
	
	// 버퍼 준비, 최대 5M 짜리 버퍼 준비
	byte[] buff = new byte[5 * 1024 * 1024];	// 5M
	int numRead = 0;
	int totalRead = 0;
	
	try {
		// 파일로부터 읽기
		while((numRead = in.read(buff,0, buff.length)) != -1) {
			totalRead += numRead;
			sout.write(buff, 0, numRead);	// 전송
			
		} // end while
	} catch(Exception e) {
		e.printStackTrace();
		
	} finally {
		sout.flush();	// 마지막 한 바이트까지 완전히 전송
		sout.close();
		in.close();
		
	}
	System.out.println("전송 byte: " + totalRead + " bytes");

%>

 

 

12. 이미지 파일이면 <img>로 보여주기

 : 이미지 파일의 경우, 업로드한 이미지를 곧바로 <img> 태그 등으로 보여지게 하고 싶으나 기존의 방법으로는 안된다.

 

[이유] 웹 경로가 아니기 때문(즉, URL로 접근할수 없는 경로이기 때문에)

 

1) WebContent 밑에 upload 폴더 추가

2) FileUpload.jsp, FileDownload.jsp, FileCheck.jsp 수정

** FileUpload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%-- cos 라이브러리 --%>
<%@ page import="com.oreilly.servlet.MultipartRequest" %>
<%@ page import="com.oreilly.servlet.multipart.FileRenamePolicy" %>
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>

<%-- parameter 값들, file 값들 추출 --%>
<%@ page import="java.util.Enumeration" %>

<%--File 객체 --%>
<%@ page import="java.io.File" %>

<%-- 이미지 파일 다루기 --%>
<%@ page import="java.awt.image.BufferedImage" %>
<%@ page import="javax.imageio.ImageIO" %>


<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>파일 업로드 결과</title>
</head>
<body>

<form action="FileCheck.jsp" method="post" name="fileCheck">
<%
	// MultipartRequest 객체 생성 준비
	//String saveDirectory = "C:\\tomcat\\upload";

	// 파일 저장경로
	// 서버에서(서블릿) 어디에 어느폴더에서 서블릿으로 변환되는지 알아내기
	ServletContext context = this.getServletContext();
	// 서블릿앙의 upload 폴더의 물리적인 경로 얻어오기
	String saveDirectory = context.getRealPath("upload");


	System.out.println("업로드 경로: " + saveDirectory);
	
	int maxPostSize = 5 * 1024 * 1024; // POST 받기, 최대 크기 5M byte 
	String encoding = "utf-8";  // 인코딩
	FileRenamePolicy policy = new DefaultFileRenamePolicy();   // 업로딩 파일 이름 중복에 대한 rename 정책
	
	MultipartRequest multi = null;
	
	try{  // jsp 파일에서 예외를 반드시 catch 할 필요는 없지만..
		
		// MultipartRequest 생성단계에서 이미 파일은 저장됨.
		multi = new MultipartRequest(
				request,   // JSP 내부객체 request
				saveDirectory,    // 업로된 파일 저장 경로
				maxPostSize,     // 최대 파일 크기 (post 크기)
				encoding,
				policy 			// 중복이름의 파일 rename 객체
				);
		
		Enumeration names = null;
		
		// 1. Parameter name 들 추출
		names = multi.getParameterNames();  // 일반 form parameter name들 추출
		while(names.hasMoreElements()){
			String name = (String)names.nextElement();  // name
			String value = multi.getParameter(name);   // value
			out.println(name + " : " + value + "<br>");
		} // end while
		out.println("<hr>");
			
		// 2. File 들 추출
		names = multi.getFileNames();  // type="file" 요소 name 들 추출
		while(names.hasMoreElements()){
			String name = (String)names.nextElement();
			out.println("input name: " + name + "<br>");
			
			// 위 name 의 '업로드 원본 파일명'을 가져온다.
			String originalFileName = multi.getOriginalFileName(name);
			out.println("원본파일 이름: " + originalFileName + "<br>");
			out.println("<input type='hidden' name='originalFileName' value='" + originalFileName + "'");
			
			// 서버 시스템에 '저장된 파일명' 을 가져온다.
			String fileSystemName = multi.getFilesystemName(name);
			out.println("파일시스템 이름: " + fileSystemName + "<br>");
			out.println("<input type='hidden' name='fileSystemName' value='" + fileSystemName + "'");
			
			// 업로딩된 파일의 타일 : MIME 타입 (ex: image/png ...)
			String fileType = multi.getContentType(name);
			out.println("파일타입: " + fileType + "<br>");
			
			// 문자열 '파일이름' 이 name 에 들어온 상태
			// 문자열 파일이름을 통해 실제 파일 정보를 -> File객제로 가져오기
			File file = multi.getFile(name);
			if(file != null){
				long fileSize = file.length();  // 파일 크기 (byte)
				out.println("파일 크기: " + fileSize + " bytes<br>");
				
				// 이미지 파일 다루기
				BufferedImage bi = ImageIO.read(file);
				if(bi != null){  //  ★이미지 파일 판정 여부★
					int width = bi.getWidth();
					int height = bi.getHeight();
					out.println("이미지파일 WxH: " + width + " x " + height + "<br>");
				} else {
					out.println("이미지가 아닙니다<br>");
				}
			}
			out.println("<hr>");
			
		} // end while
		
		
			
	} catch(Exception e){
		e.printStackTrace();
		out.println("파일 처리 예외 발생<br>");
	}
%>
<input type="submit" value="업로드 파일 확인"/><br>
</form>


</body>
</html>

 

** FileDownload.jsp

<!-- 화면에 보이는 용도가 아님, 말 그대로 다운 받는 용도임..!! -->

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ page import="java.net.*" %>
<%@ page import="java.io.*" %>
<% request.setCharacterEncoding("utf-8"); %>

<%
	String fileSystemName = request.getParameter("fileSystemName");
	if(fileSystemName == null) {return; }   // fileSystemName이 없으면 에러.
	String originalFileName = request.getParameter("originalFileName");
	if(originalFileName == null) {originalFileName = fileSystemName;}
%>

<%
	//파일을 다운로드 할때 파일의 제목이 인코딩에 따라 제목이 깨질수 있다.
	// 따라서 제목 인코딩이 필요하다
	
	// 유형을 파악해야 한다
	//  - FileInputStream : byte stream - 바이너리
	//  - FileReader : char stream  - 문자기반

	// 1) 다운로드 받을 파일의 경로및 이름  지정
	// 업로드된 폴더 위치와 업로드 폴더의 이름을 알아야 한다.
	String realPath = "";
	
	// 직접 폴더 지정할 경우
	//realPath = "C:\\tomcat\\upload";
	
	ServletContext context = getServletContext();
	realPath = context.getRealPath("upload");	
	
	System.out.println("downloadPath: " + realPath);
	
	String downloadFilePath = realPath + File.separator + fileSystemName;
	System.out.println("downloadFilePath: " + downloadFilePath);
	
	// 2. 유형(MIME)확인 - 읽어올 파일의 유형 
	//   -> response 받을 브라우저에서 페이지 생성할때 위 타입정보를 가지고 판단함
	String fileType = getServletContext().getMimeType(downloadFilePath);
	// 유형이 지정되지 않은 경우
	if(fileType == null){
		fileType = "application/octet-stream";  // 일련의 8-bit 스트림 형식
	}										// 유형이 알려지지 않은 파일에 대한 읽기 형식 지정 
	System.out.println("파일유형(MIME): " + fileType);
	
	// 3. response 세팅
	// response 에 유형(MIME)을 알려준다
	response.setContentType(fileType);
	
	// 원본 파일 이름으로 다운로드 받을수 있게 처리
	String encFileName = URLEncoder.encode(originalFileName, "utf-8");
	
	// response 헤더에 추가
	response.setHeader("Content-Disposition", "attachment; filename=" + encFileName);

	// 4. 클라이언트에 파일 전송하기 전에 내부객체 out 을 clear()
	// JSP 에서 OutputStream 을 이용해서 바이너리나 이미지 등을 스트림으로 전송할 때 밑의 response.getOutputStream() 을 해주기 전에
	// 기본적으로 생성된 내부객체 out 과의 충돌 이 생실수 있으니, 미리 clear() 한다.
	// 충돌 발생시  IllegalStateException 발생
	out.clear();   // out 객체내 출력할 내용들 제거.
	out = pageContext.pushBody();  // <-- 커스텀 태그등도 clear 하고 JspWrite(out) 에 새로운 body 생성.
	
	// 5. File 전송 --> ServletOutputStream
	File srcFile = new File(downloadFilePath);
	FileInputStream in = new FileInputStream(srcFile);
	ServletOutputStream sout = response.getOutputStream();
	
	// 버퍼 준비. 최대 5M 짜리 버퍼 준비
	byte [] buff = new byte[5 * 1024 * 1024];  // 5M
	int numRead = 0;
	int totalRead = 0;
	
	try{
		// 파일로 부터 읽기
		while((numRead = in.read(buff, 0, buff.length)) != -1){
			totalRead += numRead;
			sout.write(buff, 0, numRead);  // 전송
		} // end while
	} catch(Exception e){
		e.printStackTrace();
	} finally {
		sout.flush();  // 마지막 한 바이트까지 완전히 전송.
		sout.close();
		in.close();
	}
	System.out.println("전송 byte: " + totalRead + " bytes");
	
%>

 

** FileCheck.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ page import="java.net.*" %> <%-- URLEncoder 외 --%>

<%-- JSTL --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>  

<% request.setCharacterEncoding("utf-8"); %>

<%-- parameter 받기 : Java --%>
<%
	String [] originalFileNames = request.getParameterValues("originalFileName");
	String [] fileSystemNames = request.getParameterValues("fileSystemName");
	int cnt = originalFileNames.length;
%>

<%-- parameter 받기 : JSTL --%>
<c:set var="originalFileNames" value="${paramValues.originalFileName }"/>
<c:set var="fileSystemNames" value="${paramValues.fileSystemName }"/>
<c:set var="cnt" value="${fn:length(paramValues.originalFileName) }"/>

    
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>파일 확인 & 다운로드 링크</title>
<style>
form p {text-decoration: underline;}
form p:hover {cursor: pointer; color:blue;}
</style>
</head>
<body>
<%-- Java 방식 --%>
<h3><%= cnt %>개의 파일 확인</h3>
<ul>
<%
	for(int i = 0; i < cnt; i++){
		out.println("<li>파일: " + (i + 1) + "</li>");
		out.println("<ul>");
		out.println("<li>원본이름: " + originalFileNames[i] + "</li>");
		out.println("<li>파일시스템: " + fileSystemNames[i] + "</li>");
		out.println("</ul>");
	}
%>
</ul>

<%-- JSTL 방식 --%>
<h3>${cnt } 개의 파일 확인</h3>
<ul>
<c:forEach var="i" begin="0" end="${cnt - 1 }" varStatus="status">
	<li>파일: ${i + 1 }</li>
	<ul>
		<li>원본이름: ${originalFileNames[status.index] }</li>
		<li>파일시스템: ${fileSystemNames[status.index] }</li>
	</ul>
</c:forEach>
</ul>

<hr>

<%-- GET방식 request시 url 에  한글이나 띄어쓰기 등이 들어가선 안되기 때문에 반드시 URLEncoder 로 처리 해야 한다
X ] /FileDownload.jsp?fileSystemName=8퍼센트.ipynb
O ] /FileDownload.jsp?fileSystemName=8%ED%8D%BC%EC%84%BC%ED%8A%B8.ipynb
java.net.URLEncoder  임포트!
--%>
<h3>다운로드링크1: get + Java</h3>
<% for(int i = 0; i < originalFileNames.length; i++){ %>
	<%-- 화면에는 원본이름으로, 실제 링크는 업로드 저장된 이름으로 --%>
	<%
		String fname = URLEncoder.encode(fileSystemNames[i], "utf-8");
		String oname = URLEncoder.encode(originalFileNames[i], "utf-8");
	%>
	<a href="FileDownload.jsp?fileSystemName=<%= fname%>&originalFileName=<%= oname%>">
		<%= originalFileNames[i] %>
	</a>
	<br>
<% } %>

<h3>다운로드링크2: post + Java</h3>
<% for(int i = 0; i < originalFileNames.length; i++){ %>
<form name="frm<%=i %>" action="FileDownload.jsp" method="post">
	<input type="hidden" name="fileSystemName"
		value="<%= fileSystemNames[i] %>"/>
	<input type="hidden" name="originalFileName"
		value="<%= originalFileNames[i] %>"/>
	<p onclick="document.forms['frm<%=i%>'].submit()">
	<%= originalFileNames[i] %>
	</p>
</form>
<% } %>

<h3>다운로드링크3: post + JSTL</h3>
<c:forEach var="i" begin="0" end="${cnt -1 }">
<form name="ifrm${i }" action="FileDownload.jsp" method="post">
	<input type="hidden" name="fileSystemName"
		value="${fileSystemNames[i] }"/>
	<input type="hidden" name="originalFileName"
		value="${originalFileNames[i] }"/>
	<p onclick="document.forms['ifrm${i }'].submit()">
	${originalFileNames[i] }
	</p>
</form>
</c:forEach>

<hr>

<%--
	웹 경로에 이미지 저장한 경우
 --%>
<h3>이미지 보기</h3>
<% for(int i = 0; i < originalFileNames.length; i++){ %>
<div style="width: 300px">
	<img style="width:100%; height:auto"
		src="upload/<%=fileSystemNames[i]%>"/>
</div>
<% } %>

</body>
</html>

 

 

13. 조금만 시간이 지나면 업로드한 파일이 사라지고 서버를 재시작해도 사라진다, 

     wtpwebapps 폴더의 정체는 이클립스에서 Dynamic Web Project를 서버에서 가동할때 생성한 폴더,
     개발 단계에서 테스트하기 위한 용도,

     진짜 업로드 한 파일이 유지되게 하려면 실제 서비스 환경에서 웹 어플리케이션이 가동되어야 한다, 
     이와 같이 서비스 환경으로 배치하는 작업을 deployment라고 함 

'웹_프론트_백엔드 > JAVA프레임윅기반_풀스택' 카테고리의 다른 글

2020.06.02  (0) 2020.06.02
2020.06.01  (0) 2020.06.01
2020.05.27  (0) 2020.05.27
2020.05.26  (0) 2020.05.26
2020.05.25  (0) 2020.05.25