본문 바로가기

프로그램

[JAVA]파일 업로드 구현(SERVLET 사용)

반응형

파일 업로드 구현(SERVLET 사용)

 


스프링 없이 servlet으로만 구현해보았음


파일 중복처리를 위해 SimpleDateFormat 을 이용하여 yyyyMMddhhmmssS 값을 구해와 사용하였음



- commons-file 사용

url : http://commons.apache.org/proper/commons-fileupload/

(참고로 해당 파일은 톰캣에 기본으로 들어있음)



 

- tomcat 7

- log4j2

 

Annotation 3.0 을 활용하여 servlet 별도 셋팅 없이 servet 파일에 annotation으로 설정하였음

참고 url : http://knight76.tistory.com/entry/Tomcat7-Serlvet-30-%EB%A7%9B%EB%B3%B4%EA%B8%B0-Annotation-1

 

 

jsp소스



<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>:: UPLOAD TEST ::</title>

</head>

<body>

<h1>UPLOAD TEST</h1>

<h2>log : ${logs}</h2>

<form id="frmFile" name="frmFile" action="${pageContext.request.contextPath}/Upload" method="post" enctype="multipart/form-data">

<ul>

<li>등록자 이름</li>

<li><input id="regName" name="regName" type="text"></li>

<li>등록자 ID</li>

<li><input id="regId" name="regId" type="text"></li>

<li>파일01</li>

<li><input type="file" id="file01" name="file01"></li>

<li>파일02</li>

<li><input type="file" id="file02" name="file02"></li>

<li>파일03</li>

<li><input type="file" id="file03" name="file03"></li>

<li><input id="btnSubmit" name="btnSubmit" type="submit" value="UPLOAD FILE" ></li>

</ul>

</form>



</body>

</html>



servlet 소스


package net.lskworld.servlet;


import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.text.SimpleDateFormat;

import java.util.Date;

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 org.apache.logging.log4j.LogManager;

import org.apache.logging.log4j.Logger;

import org.apache.tomcat.util.http.fileupload.FileItem;

import org.apache.tomcat.util.http.fileupload.FileUploadException;

import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;

import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;




/**

 * Servlet implementation class Upload

 */

@WebServlet("/Upload")

public class Upload extends HttpServlet {

Logger logger = LogManager.getLogger(this.getClass()); 

       

    /**

     * @see HttpServlet#HttpServlet()

     */

    public Upload() {

        super();

        // TODO Auto-generated constructor stub

    }


/**

 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

 */

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

// TODO Auto-generated method stub

}


/**

 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

 */

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

// TODO Auto-generated method stub

//dopost로 넘어올 터니 여기에 코딩

DiskFileItemFactory factory = new DiskFileItemFactory();

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmssS"); //중복파일명 제외를 위한 셋팅

//기본 경로 지정

String path = "c:\\upload";

//path 에 임시파일이 저장됨

//기본으로는 File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir") 에서 구해온 곳에 저장됨

File repository = new File(path);

factory.setRepository(repository);

ServletFileUpload upload = new ServletFileUpload(factory);

try {

//parseRequest 하는 순간 upload 폴더에 임시파일들이 쌓임

List<FileItem> items = upload.parseRequest(request);

for(FileItem f : items) {

logger.debug("=====fileItem : \n" + f);


if(f.getName() == null ) {

continue;

}

String tmpFileNm = f.getName().split("\\.")[0];

String tmpExtNm = "";

if(f.getName().split("\\.").length > 1) {

tmpExtNm = "." + f.getName().split("\\.")[1];

}

String uploadFileNm = tmpFileNm + "_" + sdf.format(new Date()) + tmpExtNm;

//바로 파일로 저장

File uploadFile = new File(path + "\\" + uploadFileNm );

logger.debug("=====f.getName : " + f.getName());

logger.debug("=====uploadFile : " + (path + "\\" + f.getName()));

if(f.isFormField() == false) { //file 객체 필드

if(f.getName() != null && f.getName().equals("") == false) {

//임시file 삭제는 FileCleaner 를 통해 삭제되는데 

//저장된 java.io.File 객체가 가비지컬렉터 되면 작동한다고 하는 것 같음

f.write(uploadFile);

//스트림 처리

/*

InputStream uploadStream = f.getInputStream();

File uploadFile = new File(path + "\\" + f.getName());

FileOutputStream outputStream = new FileOutputStream(uploadFile);

byte[] buf = new byte[1024];

int len;

while( (len = uploadStream.read(buf)) > 0 ) {

outputStream.write(buf);

}

outputStream.close();

uploadStream.close();

*/

} else { //f.getName() != null && f.getName().equals("") == false

logger.debug("name is null");

}

} else { //일반 필드

logger.debug("파일필드 아님");

}

}

logger.info("=====items : \n" + items);


//성공 메시지

request.setAttribute("logs", "성공하였습니다.");

//처리 완료 후 forward처리

request.getRequestDispatcher("index.jsp").forward(request, response);

} catch (FileUploadException e) {

// TODO Auto-generated catch block

//logger.error(e, e);

e.printStackTrace();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


}



파일


UploadTest.war