일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 생성자오버로드
- NestedFor
- 정수형타입
- 자동차수리시스템
- 오라클
- Java
- 예외처리
- 대덕인재개발원
- 어윈 사용법
- 추상메서드
- 사용자예외클래스생성
- 다형성
- 객체 비교
- abstract
- 인터페이스
- 메소드오버로딩
- oracle
- GRANT VIEW
- 제네릭
- 환경설정
- 컬렉션 타입
- 참조형변수
- 컬렉션프레임워크
- 집합_SET
- cursor문
- EnhancedFor
- exception
- 자바
- 예외미루기
- 한국건설관리시스템
- Today
- Total
거니의 velog
231005_File 업로드, 다운로드 본문
--------------------------------------------------------
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
[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 |