JSP에서 게시판등을 만들다보면 필수로 필요한 기능이 파일 업로드 기능이다.
파일 업로드 기능은 java에서 기본으로 지원해주지 않지만, 오픈 라이브러리를 이용하면 쉽게 구현이 가능하다.
파일 업로드 라이브러리에는 대표적으로 commons-fileupload.jar 와 cos.jar가 있다.
오늘은 cos.jar 라이브러리를 이용해서 파일 업로드 기능을 구현해 보자.
1. cos.jar 파일 추가 : {documentRoot}/WEB-INF/lib/
2. 파일 전송 form 화면 작성(uploadForm.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>파일 업로드 폼</title> </head> <body> <form name="fileForm" id="fileForm" method="POST" action="fileUpload.jsp" enctype="multipart/form-data"> <input type="text" name="title" id="title"> <input type="file" name="uploadFile" id="uploadFile"> <input type="submit" value="전송"> </form> </body> </html>
파일 업로드를 하기 위해선 form 태그에 enctype="multipart/form-data" 부분이 명시되어야 한다.
또한 파일을 선택할수 있는 input 박스는 type을 file로 지정하면 된다. input type="file"
3. 파일 업로드 구현부 작성(uploadOK.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@page import="com.oreilly.servlet.MultipartRequest" %>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>
<%@page import="java.io.*" %>
<%@page import="java.util.Date" %>
<%@page import="java.text.SimpleDateFormat" %>
<%
request.setCharacterEncoding("UTF-8");
// 10Mbyte 제한
int maxSize = 1024*1024*10;
// 웹서버 컨테이너 경로
String root = request.getSession().getServletContext().getRealPath("/");
// 파일 저장 경로(ex : /home/tour/web/ROOT/upload)
String savePath = root + "upload";
// 업로드 파일명
String uploadFile = "";
// 실제 저장할 파일명
String newFileName = "";
int read = 0;
byte[] buf = new byte[1024];
FileInputStream fin = null;
FileOutputStream fout = null;
long currentTime = System.currentTimeMillis();
SimpleDateFormat simDf = new SimpleDateFormat("yyyyMMddHHmmss");
try{
MultipartRequest multi = new MultipartRequest(request, savePath, maxSize, "UTF-8", new DefaultFileRenamePolicy());
// 전송받은 parameter의 한글깨짐 방지
String title = multi.getParameter("title");
title = new String(title.getBytes("8859_1"), "UTF-8");
// 파일업로드
uploadFile = multi.getFilesystemName("uploadFile");
// 실제 저장할 파일명(ex : 20140819151221.zip)
newFileName = simDf.format(new Date(currentTime)) +"."+ uploadFile.substring(uploadFile.lastIndexOf(".")+1);
// 업로드된 파일 객체 생성
File oldFile = new File(savePath + uploadFile);
// 실제 저장될 파일 객체 생성
File newFile = new File(savePath + newFileName);
// 파일명 rename
if(!oldFile.renameTo(newFile)){
// rename이 되지 않을경우 강제로 파일을 복사하고 기존파일은 삭제
buf = new byte[1024];
fin = new FileInputStream(oldFile);
fout = new FileOutputStream(newFile);
read = 0;
while((read=fin.read(buf,0,buf.length))!=-1){
fout.write(buf, 0, read);
}
fin.close();
fout.close();
oldFile.delete();
}
}catch(Exception e){
e.printStackTrace();
}
%>
위와같이 MultipartRequest 부분에서 파일 업로드 부분을 처리한다.
나같은경우 파일을 저장할때 "20140819151221.zip" 같이 파일명을 rename하여 주로 사용한다.
이유는 예전에 EUC-KR 서버에 한글로 된 파일을 저장했다가 파일명이 깨지는 경우가 발생하여 복구가 어려웠던 기억이 있다.
요즘은 왠만한 서버들이 UTF-8로 맞춰져 있어서 큰 상관은 없지만 한번 생긴 습관이 무섭다.
또 서버 로케일이 다른 환경으로 이관할때 문제도 적기도 하다.
그런이유로 파일 업로드시 원래 파일명과 변경된 파일명을 DB에 저장하고 파일 다운로드 구현시 원본 파일명으로 내보낸다.
'Language > Java / JSP' 카테고리의 다른 글
| [JAVA] File renameTo() 에러에 관하여 (0) | 2014.08.22 |
|---|---|
| [JSP] 파일 다운로드 구현하기 (13) | 2014.08.21 |
| [JSP] 이미지 사이즈(width, height) 알아내기 (0) | 2014.08.07 |
| [Java] SMTP 메일전송 한글깨짐 해결 (0) | 2014.08.07 |
| [Java] Json 파싱(Json -> Map 변환) (0) | 2014.08.06 |
cos.jar