생각하는 감쟈
[JAVA] 파일_02 : File_Download Form 본문
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