관리 메뉴

거니의 velog

231005_File 업로드, 다운로드 본문

대덕인재개발원_자바기반 애플리케이션

231005_File 업로드, 다운로드

Unlimited00 2023. 10. 5. 17:33
--------------------------------------------------------

create table fileinfo(
    file_no number not null, -- 파일 번호(자동 증가)
    file_writer varchar2(50) not null, -- 작성자 이름
    origin_file_name varchar2(250) not null, -- 원본 파일 이름
    save_file_name varchar2(250) not null, -- 저장 파일 이름
    file_size number, -- 파일 크기
    file_date date not null, -- 파일 등록 날짜
    primary key (file_no)
);

create sequence fileinfo_seq
start with 1 
increment by 1 
nomaxvalue nocache;

select 'private ' || 
        decode(lower(data_type), 'number', 'int ', 'String ') || 
        lower(column_name) || ';'
  from cols
 where lower(table_name) = 'fileinfo';

[FileInfoVO.java]

package kr.or.ddit.vo;

/**
 * 파일 정보가 저장될 VO 예제
 * @author PC_23
 *
 */
public class FileInfoVO {

	private int file_no;
	private String file_writer;
	private String origin_file_name;
	private String save_file_name;
	private long file_size;
	private String file_date;
	
	public FileInfoVO() {}
	public FileInfoVO(int file_no, String file_writer, String origin_file_name, String save_file_name, long file_size,
			String file_date) {
		this.file_no = file_no;
		this.file_writer = file_writer;
		this.origin_file_name = origin_file_name;
		this.save_file_name = save_file_name;
		this.file_size = file_size;
		this.file_date = file_date;
	}
	
	public int getFile_no() {
		return file_no;
	}
	public void setFile_no(int file_no) {
		this.file_no = file_no;
	}
	public String getFile_writer() {
		return file_writer;
	}
	public void setFile_writer(String file_writer) {
		this.file_writer = file_writer;
	}
	public String getOrigin_file_name() {
		return origin_file_name;
	}
	public void setOrigin_file_name(String origin_file_name) {
		this.origin_file_name = origin_file_name;
	}
	public String getSave_file_name() {
		return save_file_name;
	}
	public void setSave_file_name(String save_file_name) {
		this.save_file_name = save_file_name;
	}
	public long getFile_size() {
		return file_size;
	}
	public void setFile_size(long file_size) {
		this.file_size = file_size;
	}
	public String getFile_date() {
		return file_date;
	}
	public void setFile_date(String file_date) {
		this.file_date = file_date;
	}
	
	@Override
	public String toString() {
		return "FileInfoVO [file_no=" + file_no + ", file_writer=" + file_writer + ", origin_file_name="
				+ origin_file_name + ", save_file_name=" + save_file_name + ", file_size=" + file_size + ", file_date="
				+ file_date + "]";
	}
	
}

[mybatis-config.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration 
	PUBLIC "-//mybatis.org/DTD Config 3.0//EN" 
	"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- DB연결 정보가 저장된 properties파일에 대한 정보를 설정한다. -->
	<properties resource="kr/or/ddit/mybatis/config/dbinfo.properties" />
	
	<!-- MyBatis 설정과 관련된 기본 setting 설정 -->
	<settings>
		<!-- 데이터가 null로 전달되었으면 빈칸으로 인식하지 말고 null로 인식하라 -->
		<setting name="jdbcTypeForNull" value="NULL" />
	</settings>
	
	<typeAliases>
		<typeAlias type="kr.or.ddit.vo.MemberVO" alias="memVo" />
		<typeAlias type="kr.or.ddit.vo.LprodVO" alias="lprodVo" />
		<typeAlias type="kr.or.ddit.vo.FileInfoVO" alias="fileVo" />
	</typeAliases>
	
	<!-- DB연결 설정 -->
	<environments default="oracleDev">
		<environment id="oracleDev">
			<!-- 오라클 -->
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${driver}" />
				<property name="url" value="${url}" />
				<property name="username" value="${user}" />
				<property name="password" value="${pass}" />
			</dataSource>
		</environment>
		<!-- <environment id="m1">
			MySql
		</environment> -->
	</environments>
	
	<mappers>
		<mapper resource="kr/or/ddit/mybatis/mappers/member-mapper.xml" />
		<mapper resource="kr/or/ddit/mybatis/mappers/lprod-mapper.xml" />
		<mapper resource="kr/or/ddit/mybatis/mappers/fileinfo-mapper.xml" />
	</mappers>
</configuration>

[fileinfo-mapper.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper 
	PUBLIC "-//mybatis.org/DTD Mapper 3.0//EN" 
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="fileinfo">

	<insert id="insertFileInfo" parameterType="fileVo">
		INSERT INTO fileinfo (file_no, file_writer, origin_file_name, save_file_name, file_size, file_date) 
		VALUES (fileinfo_seq.nextval, #{file_writer}, #{origin_file_name}, #{save_file_name}, #{file_size}, sysdate)
	</insert>
	
	<select id="getAllFileInfo" resultType="fileVo">
		select * from fileinfo
	</select>
	
	<select id="getFileInfo" parameterType="int" resultType="fileVo">
		select * from fileinfo where file_no = #{file_no}
	</select>
	
</mapper>

[IFileInfoDao.java]

package kr.or.ddit.fileupload.dao;

import java.util.List;

import kr.or.ddit.vo.FileInfoVO;

public interface IFileInfoDao {

	/**
	 * UPLOAD된 파일 정보가 저장된 FileInfoVO객체를 매개변수로 받아서
	 * DB에 insert하는 메서드
	 * 
	 * @param fvo insert할 파일 정보가 저장된 FileInfoVO객체
	 * @return 작업 성공 : 1, 작업 실패 : 0
	 */
	public int insertFileInfo(FileInfoVO fvo);
	
	/**
	 * DB에 저장된 전체 파일 목록을 가져와 List에 담아서 반환하는 메서드
	 * 
	 * @return 전체 파일 정보가 저장된 List객체
	 */
	public List<FileInfoVO> getAllFileInfo();
	
	/**
	 * 파일 번호를 매개변수로 받아서 해당 파일 정보를 검색하여 반환하는 메서드
	 * 
	 * @param fileNo 검색할 파일 번호
	 * @return 검색된 파일 정보가 저장된 FileInfoVO객체
	 */
	public FileInfoVO getFileInfo(int fileNo);
	
}

[IFileInfoService.java]

package kr.or.ddit.fileupload.service;

import java.util.List;

import kr.or.ddit.vo.FileInfoVO;

public interface IFileInfoService {

	/**
	 * UPLOAD된 파일 정보가 저장된 FileInfoVO객체를 매개변수로 받아서
	 * DB에 insert하는 메서드
	 * 
	 * @param fvo insert할 파일 정보가 저장된 FileInfoVO객체
	 * @return 작업 성공 : 1, 작업 실패 : 0
	 */
	public int insertFileInfo(FileInfoVO fvo);
	
	/**
	 * DB에 저장된 전체 파일 목록을 가져와 List에 담아서 반환하는 메서드
	 * 
	 * @return 전체 파일 정보가 저장된 List객체
	 */
	public List<FileInfoVO> getAllFileInfo();
	
	/**
	 * 파일 번호를 매개변수로 받아서 해당 파일 정보를 검색하여 반환하는 메서드
	 * 
	 * @param fileNo 검색할 파일 번호
	 * @return 검색된 파일 정보가 저장된 FileInfoVO객체
	 */
	public FileInfoVO getFileInfo(int fileNo);
	
}

[FileInfoDaoImpl.java]

package kr.or.ddit.fileupload.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import kr.or.ddit.util.MyBatisUtil;
import kr.or.ddit.vo.FileInfoVO;

public class FileInfoDaoImpl implements IFileInfoDao {

	private static FileInfoDaoImpl dao;
	private FileInfoDaoImpl() {}
	public static FileInfoDaoImpl getInstance() {
		if(dao == null) dao = new FileInfoDaoImpl();
		return dao;
	}
	
	@Override
	public int insertFileInfo(FileInfoVO fvo) {
		SqlSession session = MyBatisUtil.getSqlSession();
		int cnt = 0; // 반환값이 저장될 변수
		
		try {
			cnt = session.insert("fileinfo.insertFileInfo", fvo);
			if(cnt > 0) session.commit();
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(session != null) session.close();
		}
		
		return cnt;
	}

	@Override
	public List<FileInfoVO> getAllFileInfo() {
		SqlSession session = MyBatisUtil.getSqlSession();
		List<FileInfoVO> fileList = null; // 반환값이 저장될 변수
		
		try {
			fileList = session.selectList("fileinfo.getAllFileInfo");
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(session != null) session.close();
		}
		
		return fileList;
	}

	@Override
	public FileInfoVO getFileInfo(int fileNo) {
		SqlSession session = MyBatisUtil.getSqlSession();
		FileInfoVO fileVo = null; // 반환값이 저장될 변수
		
		try {
			fileVo = session.selectOne("fileinfo.getFileInfo", fileNo);
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(session != null) session.close();
		}
		
		return fileVo;
	}

}

[FileInfoServiceImpl.java]

package kr.or.ddit.fileupload.service;

import java.util.List;

import kr.or.ddit.fileupload.dao.FileInfoDaoImpl;
import kr.or.ddit.fileupload.dao.IFileInfoDao;
import kr.or.ddit.vo.FileInfoVO;

public class FileInfoServiceImpl implements IFileInfoService {

	private IFileInfoDao dao;
	
	private static FileInfoServiceImpl service;
	private FileInfoServiceImpl() {
		dao = FileInfoDaoImpl.getInstance();
	}
	public static FileInfoServiceImpl getInstance() {
		if(service == null) service = new FileInfoServiceImpl();
		return service;
	}
	
	@Override
	public int insertFileInfo(FileInfoVO fvo) {
		return dao.insertFileInfo(fvo);
	}

	@Override
	public List<FileInfoVO> getAllFileInfo() {
		return dao.getAllFileInfo();
	}

	@Override
	public FileInfoVO getFileInfo(int fileNo) {
		return dao.getFileInfo(fileNo);
	}

}

[fileMain.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>파일 업로드, 다운로드 테스트</title>
	</head>
	<body>
		<a href="<%= request.getContextPath() %>/fileList.do">파일 목록 보기</a>
	</body>
</html>

[FileList.java]

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

// DB에 저장된 파일 목록을 가져와 View로 보내는 Servlet
@WebServlet("/fileList.do")
public class FileList extends HttpServlet {
	
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		IFileInfoService service = FileInfoServiceImpl.getInstance();
		
		// 전체 목록 가져오기
		List<FileInfoVO> fileList = service.getAllFileInfo();
		
		// 가져온 전체 목록을 View로 보낸다.
		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>파일 업로드, 다운로드 테스트 - 파일 목록 보기</title>
	</head>
	<body>
		<% 
			// 서블릿(Controller)에서 보내온 자료 받기
			List<FileInfoVO> fileList = (List<FileInfoVO>) request.getAttribute("fileList");
		%>
		<h2>전체 파일 목록</h2><br /><hr /><br />
		<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">파일 목록이 하나도 없습니다...</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>-</td>
						</tr>
				<%	
					}
				}
				%>
			</tbody>
		</table>
	</body>
</html>

- http://localhost:8090/webTest/basic/fileupload/fileMain.jsp


[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>파일 업로드, 다운로드 테스트 - 파일 목록 보기</title>
	</head>
	<body>
		<% 
			// 서블릿(Controller)에서 보내온 자료 받기
			List<FileInfoVO> fileList = (List<FileInfoVO>) request.getAttribute("fileList");
		%>
		<h2>전체 파일 목록</h2><br /><hr /><br />
		
		<a href="<%= request.getContextPath() %>/fileUpload.do">파일 업로드</a><br /><br />
		
		<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">파일 목록이 하나도 없습니다...</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>-</td>
						</tr>
				<%	
					}
				}
				%>
			</tbody>
		</table>
	</body>
</html>

[fileUploadForm.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
	<head>
		<meta charset="UTF-8">
		<title>파일 업로드 페이지</title>
	</head>
	<body>
		<h2>File Upload 연습</h2>
		<form action="<%= request.getContextPath() %>/fileUpload.do" method="post" enctype="multipart/form-data">
		
			<label>작성자 이름 : </label>
			<input type="text" name="username" /><br /><br />
			
			<label>한 개 파일 선택 : </label>
			<input type="file" name="upfile1" /><br /><br />
			
			<label>여러 개 파일 선택 : </label>
			<input type="file" name="upfile2" multiple /><br /><br />
			
			<button type="submit">파일 전송</button>
			
		</form>
	</body>
</html>

- http://localhost:8090/webTest/basic/fileupload/fileUploadForm.jsp


[FileUpload.java]

package kr.or.ddit.fileupload.controller;

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;


@WebServlet("/fileUpload.do")
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 {
		
	}

}

- http://localhost:8090/webTest/basic/fileupload/fileList.jsp

get 방식으로 forward 되었다.


[FileUpload.java]

package kr.or.ddit.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.fileupload.service.FileInfoServiceImpl;
import kr.or.ddit.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, 기본값 : -1 <무제한> )
 *   4) maxRequestSize : 서버로 전송되는 Request데이터 전체의 최대 크기 ( 단위 : byte, 기본값 : -1 <무제한> )
 */
@WebServlet("/fileUpload.do")
@MultipartConfig(
	fileSizeThreshold = 1024 * 1024 * 10, // 10mb
	maxFileSize = 1024 * 1024 * 20, // 30mb
	maxRequestSize = 1024 * 1024 * 100 // 100mb
)
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 {
		
		request.setCharacterEncoding("utf-8");
		
		// 업로드된 파일들이 저장될 폴더 설정 (서버 컴퓨터에 있는 폴더)
		String uploadPath = "d:/d_other/uploadFiles";
		
		// 지정된 폴더가 없으면 새로 만든다.
		File f = new File(uploadPath);
		if(!f.exists()) {
			f.mkdirs();
		}
		
		// 파일이 아닌 일반 데이터는 getParameter()메서드나 getParameterValues()메서드를
		// 이용해서 구한다.
		String username = request.getParameter("username");
		System.out.println("일반 파라미터 데이터 : " + username);
		
		//-----------------------------------------------------
		
		// 수신 받은 파일 데이터 처리하기
		String fileName = ""; // 파일명이 저장될 변수 선언
		
		// Upload한 파일 목록이 저장될 List객체 생성
		List<FileInfoVO> fileList = new ArrayList<FileInfoVO>();
		
		/*
		 * - Servlet 3.0 이상에서 새롭게 추가된 Part객체 처리용 메서드
		 *   1) Request객체.getParts() ==> 전체 Part객체를 Collection객체에 담아서 반환한다.
		 *   2) Request객체.getPart("이름") ==> 지정된 '이름'을 가진 개별 Part객체를 반환한다.
		 *   	'이름' ==> <form>태그 안의 입력 요소의 name속성값으로 구별한다.
		 */
		
		// 전체 Part객체 개수만큼 반복 처리
		for(Part part : request.getParts()) {
			
			fileName = extractFileName(part); // Part에서 파일명을 구해온다.
			
			// 구해온 파일명이 빈문자열("")이면 파일이 아닌 일반 파라미터가 된다.
			if(!"".equals(fileName)) { // 파일 여부를 검사
				
				// 1개의 Upload 파일에 대한 정보를 저장할 VO객체 생성
				FileInfoVO fvo = new FileInfoVO();
				
				fvo.setFile_writer(username); // 작성자를 VO에 저장
				fvo.setOrigin_file_name(fileName); // 원래의 파일명을 VO에 저장
				
				// 실제 저장되는 파일 이름이 중복되는 것을 방지하기 위해서 UUID를 이용하여
				// 저장할 파일명을 만든다.
				String saveFileName = UUID.randomUUID().toString() + "_" + fileName;
				
				// 이 값을 VO에 '저장할 파일명'으로 저장
				fvo.setSave_file_name(saveFileName);
				
				// 파일 크기는 Part객체의 getSize()메서드를 이용하여 구한다. (단위 : byte)
				// byte값 ==> KB로 변환해서 저장
				fvo.setFile_size( (long) Math.ceil(part.getSize() / 1024.0) );
				
				// 파일을 지정한 폴더에 저장하기
				// part객체의 write()메서드를 이용한다.
				try {
					part.write(uploadPath + File.separator + saveFileName); // 파일 저장
				} catch (Exception e) {
					e.printStackTrace();
				}
				
				// 저장한 파일 정보를 List에 추가
				fileList.add(fvo);
				
			} // if문 끝...
			
		} // for문 끝...
		
		// Upload된 파일 정보를 DB에 추가한다.
		IFileInfoService service = FileInfoServiceImpl.getInstance();
		
		// List에 저장된 데이터들을 하나씩 차례로 DB에 추가한다.
		for(FileInfoVO fvo : fileList) {
			service.insertFileInfo(fvo);
		}
		
		// 작업이 완료되면 파일 목록을 보여주는 페이지로 이동한다.
		response.sendRedirect(request.getContextPath() + "/fileList.do");
		
	} // doPost() 메서드 끝...
	
	//------------------------------------------------
	/*
	 * - Part객체의 구조
	 * 
	 *   1) 파일이 아닌 일반 파라미터 데이터일 경우
	 *   
	 *   --------------------32948sdfsf=23fsdgf 			==> Part를 구분하는 구분선
	 *   content-disposition: form-data; name="username"	==> 파라미터 명
	 *   													==> 빈줄
	 *   Hong												==> 파라미터 값
	 *   
	 */
	
	/*
	 *   2) 파일일 경우
	 *   
	 *   --------------------32948sdfsf=23fsdgf 									==> Part를 구분하는 구분선
	 *   content-disposition: form-data; name="upfile1"; filename="test1.txt"		==> 파일 정보
	 *   content-type: text/plain													==> 파일 종류
	 *   																			==> 빈줄
	 *   abcd1234																	==> 파일 내용
	 *   
	 */
	
	// Part구조 안에서 파일명을 찾는 메서드
	// ==> 파일일 때는 '해당 파일명'을 반환하고, 파일이 아닐 때는 빈문자열("")을 반환한다.
	private String extractFileName(Part part) {
		String fileName = ""; // 반환값이 저장될 변수
		
		String value = part.getHeader("content-disposition");
		// value = "form-data; name='upfile1'; filename='test1.txt'";
		String[] items = value.split(";");
//		items = [ 
//			form-data, 
//			name="upfile1", 
//			filename="test1.txt" 
//		];
		
		for(String item : items) {
			if(item.trim().startsWith("filename")) {
				fileName = item.substring(item.indexOf("=")+2, item.length()-1);
			}
		}
		
		return fileName;
	}

}

- http://localhost:8090/webTest/basic/fileupload/fileList.jsp


[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>파일 업로드, 다운로드 테스트 - 파일 목록 보기</title>
	</head>
	<body>
		<% 
			// 서블릿(Controller)에서 보내온 자료 받기
			List<FileInfoVO> fileList = (List<FileInfoVO>) request.getAttribute("fileList");
		%>
		<h2>전체 파일 목록</h2><br /><hr /><br />
		
		<a href="<%= request.getContextPath() %>/fileUpload.do">파일 업로드</a><br /><br />
		
		<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">파일 목록이 하나도 없습니다...</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() %>/fileDownload.do?fileno=<%= fvo.getFile_no() %>">DownLoad</a></td>
						</tr>
				<%	
					}
				}
				%>
			</tbody>
		</table>
	</body>
</html>

- http://localhost:8090/webTest/fileList.do


[FileDownload.java]

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


// 파일 다운로드를 처리하는 서블릿
@WebServlet("/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 strFileNo = request.getParameter("fileno");
		int fileno = Integer.parseInt(strFileNo);
		
		// 파일 번호를 이용하여 DB에서 해당 파일 정보를 가져온다.
		IFileInfoService service = FileInfoServiceImpl.getInstance();
		
		FileInfoVO fvo = service.getFileInfo(fileno);
		
		// 업로드 된 파일이 저장될 폴더 설정
		String uploadPath = "d:/d_other/uploadFiles";
		
		// 지정된 폴더가 없으면 새로 만든다.
		File f = new File(uploadPath);
		if(!f.exists()) {
			f.mkdirs();
		}
		
		response.setCharacterEncoding("utf-8");
		
		// 다운 받을 파일의 File객체 생성 ==> 실제 저장된 파일명을 이용하여 생성한다.
		File downFile = new File(f, fvo.getSave_file_name());
		
		if(downFile.exists()) { // 다운 할 파일이 해당 폴더에 존재하면...
			
			// ContentType 설정
			response.setContentType("application/octet-stream; charset=utf-8");
			
			// Response객체에 content-disposition 헤더 정보를 추가한다.
			// 이 헤더 정보에는 다운된 파일이 저장될 파일명을 설정한다.
			
			String headerKey = "content-disposition";
			
			// 다운로드할 때 클라이언트에 저장될 파일 이름을 지정한다.
			//	==> 원래의 파일명으로 지정한다.
			String headerValue = "attachment; filename=\"" + fvo.getOrigin_file_name() + "\";";
			response.setHeader(headerKey, headerValue);
			
			// 자바의 입출력 스트림을 이용해서 서버에 있는 파일을 읽어서 클라이언트로 출력하는
			// 작업을 진행하면 된다.
			BufferedInputStream bin = null;
			BufferedOutputStream bout = null;
			try {
				// 출력용 스트림 객체 생성 (Response객체를 이용한다.)
				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(bin != null) try { bin.close(); } catch (Exception e) {}
				if(bout != null) try { bout.close(); } catch (Exception e) {}
			}
			
		}else { // 파일이 없을 때...
			response.setContentType("text/html; charset=utf-8");
			response.getWriter().println("<h3>"+ fvo.getOrigin_file_name() +" 파일이 존재하지 않습니다.</h3>");
		}
	}

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

}

- http://localhost:8090/webTest/fileList.do


[FileDownload.java]

@WebServlet("/fileDownload.do")
public class FileDownload extends HttpServlet {
	
        ...

        // 다운로드할 때 클라이언트에 저장될 파일 이름을 지정한다.
        //	==> 원래의 파일명으로 지정한다.
        String headerValue = "attachment; filename*=UTF-8''" + URLEncoder.encode(fvo.getOrigin_file_name(), "utf-8").replaceAll("\\+", "%20");

        response.setHeader(headerKey, headerValue);

        ...

}


[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="<%= request.getContextPath() %>/images/꽃.jpg" style="width: 200px;" /><br /><br />
		<img src="../../images/꽃.jpg" style="width: 200px;" /><br /><br />
	</body>
</html>

- http://localhost:8090/webTest/basic/fileupload/imageView.jsp


[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="<%= request.getContextPath() %>/images/꽃.jpg" style="width: 200px;" /><br /><br />
		<img src="../../images/꽃.jpg" style="width: 200px;" /><br /><br />
		<img src="<%= request.getContextPath() %>/images/imageView.do?fileno=2" style="width: 200px;" /><br /><br />
	</body>
</html>

[ImageView.java]

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


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

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		
		// 파라미터로 넘어 온 파일 번호를 구한다.
		String strFileNo = request.getParameter("fileno");
		int fileno = Integer.parseInt(strFileNo);
		
		// 파일 번호를 이용하여 DB에서 해당 파일 정보를 가져온다.
		IFileInfoService service = FileInfoServiceImpl.getInstance();
		
		FileInfoVO fvo = service.getFileInfo(fileno);
		
		// 업로드 된 파일이 저장될 폴더 설정
		String uploadPath = "d:/d_other/uploadFiles";
		
		// 지정된 폴더가 없으면 새로 만든다.
		File f = new File(uploadPath);
		if(!f.exists()) {
			f.mkdirs();
		}
		
		File downFile = new File(f, fvo.getSave_file_name());
		
		if(downFile.exists()) {
			
			// 자바의 입출력 스트림을 이용해서 서버에 있는 파일을 읽어서 클라이언트로 출력하는
			// 작업을 진행하면 된다.
			BufferedInputStream bin = null;
			BufferedOutputStream bout = null;
			try {
				// 출력용 스트림 객체 생성 (Response객체를 이용한다.)
				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(bin != null) try { bin.close(); } catch (Exception e) {}
				if(bout != null) try { bout.close(); } catch (Exception e) {}
			}
			
		}
		
		
	}

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

}

- http://localhost:8090/webTest/basic/fileupload/imageView.jsp

'대덕인재개발원_자바기반 애플리케이션' 카테고리의 다른 글

231010_Redmine  (0) 2023.10.10
231005_고급자바과제_회원정보관리  (1) 2023.10.07
231005_JSON  (0) 2023.10.05
231004_유스케이스 다이어그램 작성  (0) 2023.10.04
231004_Servlet 5  (0) 2023.10.02