romworld

File Upload 본문

JAVA/개념정리

File Upload

inderrom 2022. 12. 6. 04:03

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()%>/fileList.do">파일 목록 보기</a>
</body>
</html>

FileList

package kr.or.ddit.basic.fileupload.controller;

import java.io.IOException;
import java.util.List;

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.basic.fileupload.service.FileInfoServiceImpl;
import kr.or.ddit.basic.fileupload.service.IFileInfoService;
import kr.or.ddit.vo.FileInfoVO;


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

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		
		// Service객체 생성
		IFileInfoService service = FileInfoServiceImpl.getInstance();
		
		// DB에 저장된 전체 파일 정보 가져오기
		List<FileInfoVO> fileList = service.getAllFileinfo();
		
		// 구해진 파일 목록 정보를 View페이지로 보낸다 (forwarding방식으로...)
		request.setAttribute("fileList", fileList);
		
		request.getRequestDispatcher("/basic/fileupload/fileList.jsp")
										.forward(request, response);
		
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

fileList.jsp

<%@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>
<%
	// 서블릿에서 보내온 자료 받아오기
	List<FileInfoVO> fileList = (List<FileInfoVO>)request.getAttribute("fileList");
%>
</head>
<body>

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

<a href="<%=request.getContextPath()%>/fileUpload.do">파일 업로드</a>
<table border="1">
<thead>
	<tr>
		<td>번호</td><td>작성자</td><td>저장 파일명</td><td>원래의 파일명</td><td>파일크기</td>
		<td>날짜</td><td>비 고</td>
	</tr>
</thead>

<tbody>
<%
if(fileList==null || fileList.size()==0){
%>
	<tr><td colspan="7" style="text-aling : center;"> 파일 목록이 하나도 없습니다.</td></tr>
<%
}else{
	for(FileInfoVO fileVo : fileList){
%>
	<tr>
		<td><%=fileVo.getFile_no() %></td>
		<td><%=fileVo.getFile_writer() %></td>
		<td><%=fileVo.getSave_file_name() %></td>
		<td><%=fileVo.getOrigin_file_name() %></td>
		<td><%=fileVo.getFile_size() %></td>
		<td><%=fileVo.getFile_date() %></td>
		<td><a href="<%=request.getContextPath()%>/fileDownload.do?fileno=<%=fileVo.getFile_no()%>">Download</a></td>
	</tr>
<%		
	}
}
%>
</tbody>
</table>
</body>
</html>

 

FileUpload

package kr.or.ddit.basic.fileupload.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.basic.fileupload.service.FileInfoServiceImpl;
import kr.or.ddit.basic.fileupload.service.IFileInfoService;
import kr.or.ddit.vo.FileInfoVO;

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

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

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 현재 서블릿을 GET방식으로 요청하면 무조건 file 입력 폼으로 이동하기
		request.getRequestDispatcher("/basic/fileupload/fileUploadForm.jsp")
					.forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 파일 업로드는 무조건 POST방식만 사용할 수 있다.
		request.setCharacterEncoding("utf-8");
		
		// 업로드된 파일이 저장될 폴더 설정
		String uploadPath = "/Users/rom/Desktop/uploadFiles";
		
		// 저장될 폴더가 없으면 새로 만들어 놓는다.
		File f = new File(uploadPath);
		if(!f.exists()) {
			f.mkdirs();
		}
		
		// 파일이 아닌 일반 파라미터 데이터는 getParameter() 메서드나 getParameterValues()메서드를
		// 이용해서 구한다.
		String userName = request.getParameter("username");
		System.out.println("일반 파라미터 데이터 username =" + userName);
		
		//----------------------------------------------------------------
		
		// 수신 받은 파일 데이터 처리하기...
		
		String fileName ="";	// 원래의 파일명이 저장될 변수
		
		// 업로드한 파일이 여러개일 때 전체 파일 정보가 저장될 List객체 생성
		List<FileInfoVO> fileList = new ArrayList<FileInfoVO>();
		
		/*
		- Servlet 3.0이상에서 새롭게 추가된 Upload용 메서드
		1) request.getParts()	==> 전체 Part객체를 Collection객체에 담아서 반환한다.
		2) request.getPart("이름") ==> 지정된 '이름'을 가진 개별 Part객체를 반환한다.
					'이름' ==> form태그의 입력요소의 name속성값으로 구별한다.
		*/
		
		// 전체 Part객체 개수만큼 반복 처리
		for(Part part : request.getParts()) {
			fileName = extractFilename(part);  // 파일명 구하기
			
			// 찾는 파일명이 빈문자열("")이면 이것은 파일 아닌 일반 파라미터라는 의미이다.
			if(!"".equals(fileName)) {  // 파일인지 검사
				// 1개의 Upload된 파일에 대한 정보를 저장할 VO객체 생성
				FileInfoVO fvo = new FileInfoVO();
				
				fvo.setFile_writer(userName);     // 작성자
				fvo.setOrigin_file_name(fileName);  // 원래의 파일명
				
				// 실제 저장되는 파일이름이 중복되는 것을 방지하기 위해서 UUID객체를 이용하여
				// 저장할 파일명을 만든다.
				String saveFilename = UUID.randomUUID().toString();
				
				// 새롭게 만들어진 저장할 파일명을 VO에 셋팅
				fvo.setSave_file_name(saveFilename);
				
				// part.getSize()메서드를 이용해서 파일의 크기르 구할 수 있다. (단위 : byte)
				// byte단위를 KB단위로 변환해서 VO에 셋팅
				fvo.setFile_size((int)Math.ceil(part.getSize() / 1024.0));
				
				// 파일 저장하기
				try {
					// part.write() 메서드를 이용하여 upload된 파일을 저장한다.
					// 형식) part.write("저장할 경로/저장할 파일명");
					part.write(uploadPath + File.separator+ saveFilename); // 파일 저장 
				} catch (IOException e) {
					e.printStackTrace();
				}
				
				// 1개의 파일 정보를 List에 추가한다.
				fileList.add(fvo);
				
			}  // if문 끝..
		}  // for문 끝...
		
		// 파일 정보를 DB에 추가한다.
		IFileInfoService service = FileInfoServiceImpl.getInstance(); // 서비스 객체 생성
		
		// List에 저장된 데이터를 DB에 추가하기 (반복문 이용)
		for(FileInfoVO fvo : fileList) {
			service.insertFileinfo(fvo);
		}
		
		// 저장이 완료된 후에는 파일 목록을 보여준다.
		response.sendRedirect(request.getContextPath() + "/fileList.do");
		
		
	}
	//-------------------------------------------------
	
	/*
	- Part 구조
	1) 파일이 아닌 일반 파라미터 데이터인 경우
	
	---------------------------asdfslakdflaksdlfsjdk  ==> Part를 구분하는 구분선 역할을 한다.
	content-disposition : form-data; name="username"  ==> 파라미터 명
						==> 빈줄
	Hong    			==> 파라미터 값 
	*/

	/*
	2) 파일일 경우
	---------------------------asdfslakdflaksdlfsjdk  ==> Part를 구분하는 구분선 역할을 한다.
	content-disposition : form-data; name="upfile1"; filename="test1.txt"  ==> 파일 정보
	content-type : text/plain			  ==> 파일 종류
										  ==> 빈줄
	abcd1234안녕						  ==> 파일 내용
	*
	*/
	
	
	// Part구조 안에서 파일명을 찾는 메서드
	private String extractFilename(Part part) {
		String fileName = "";
		
		String contentDisposition = part.getHeader("content-disposition");
		String[] items = contentDisposition.split(";");
		for(String item : items) {
			if(item.trim().startsWith("filename")) {	// filename="test1.txt"
				fileName = item.substring(item.indexOf("=")+2, item.length()-1);
				
			}
		}
		
		return fileName;
	}

}

 

fileUploadForm.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>
<h3>File Upload Form</h3>
<form action="<%=request.getContextPath()%>/fileUpload.do" 
		method="post" enctype="multipart/form-data">
		
 		<!--파일 업로드는 post밖에 못함, enctype을 적어줘야함 -->
 - 작성자 이름 : <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="전 송">
 <button type="submit">전 송</button>
</form>
<br><hr><br>

<a href="<%=request.getContextPath()%>/fileList.do">파일 목록 보기</a>

</body>
</html>

 

 

 


img 업로드

 

imageView.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>

<img src="../../images/카푸치노.jpg" width="200"><br><br>
<img src="/webTest/images/카푸치노.jpg" width="200"><br><br>
<img src="<%=request.getContextPath() %>/images/카푸치노.jpg" width="200"><br>


<img src="<%=request.getContextPath() %>/images/imageSrcView.do?fileno=3" width="200"><br>


</body>
</html>

 

ImageSrcView

package kr.or.ddit.basic.fileupload.controller;

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

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.basic.fileupload.service.FileInfoServiceImpl;
import kr.or.ddit.basic.fileupload.service.IFileInfoService;
import kr.or.ddit.vo.FileInfoVO;


@WebServlet("/images/imageSrcView.do")
public class ImageSrcView extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		
		int fileNo = Integer.parseInt(request.getParameter("fileno")); 
		
		IFileInfoService service = FileInfoServiceImpl.getInstance();
		FileInfoVO fvo = service.getFileinfo(fileNo);  
		
		String filePath = "/Users/rom/Desktop/uploadFiles";
		File file = new File(filePath, fvo.getSave_file_name());
		
		BufferedInputStream bin = null;
		BufferedOutputStream bout = null;
		
		try {
			
			bout = new BufferedOutputStream(response.getOutputStream());
			bin = new BufferedInputStream(new FileInputStream(file));
			
			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(bin!=null) try {bin.close();} catch(IOException e) {}
			if(bout!=null) try {bout.close();} catch(IOException e) {}
		}
		
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

'JAVA > 개념정리' 카테고리의 다른 글

File upload 2  (1) 2022.12.08
Ajax ( JSON)  (1) 2022.12.06
Session  (0) 2022.12.06
Cookie 2 ( login)  (0) 2022.12.06
Cookie  (0) 2022.12.06
Comments