본문 바로가기

OpenSource/Spring

Spring 업로드 구현

1. jar추가.
필요한 jar파일은 다음과 같다.
 - commons-fileupload-1.2.jar
 - commons-io-1.3.jar

2. Spring Bean설정.
아래와 같이 CommonsMultipartResolver를 추가해준다.
 <bean id="multipartResolver"

 class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

 <property name="maxUploadSize" value="30720000" />

</bean>


그리고 컨트룰러 등록. 여기서 업로드 기본디렉토리를 설정해준다.
  <bean id="cpnupload"
  class
="net.tino.controller.cpOper.CpnUploadController">

  <property name="uploadDir" value="E://COUPONE" />

</bean>


3. 업로드폼
주의할점은... enctype="multipart/form-data"를 반드시 명시해야 한다는점은 왠만하면 다 알고있을터... method="post"도 반드시 명시해줘야하고, 필드명에 반드시 name 명시를
해주어야 한다는것이다. 컨트룰러에서 value를 name을 인식해서 가져오는거같다.(보통 난 폼 컨트롤할때 id를 쓰는데... 이거 때문에 삽질좀 했다 ㅡ_ㅡ;;;)

 <%@ page language="java" contentType="text/html; charset=EUC-KR"

       pageEncoding="EUC-KR"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

 

<html>

<head>

<meta http-equiv="content-type" content="text/html; charset=euc-kr">

<title>ㄷㄷㄷ;;;</title>

<script language="javascript" src="../scripts/inc_util.js"></script>

<script language="JavaScript">

function upload(){

       var fileName = str_trim(document.frm.f1.value);

 

       var arr=("file:///"+fileName.replace(/ /gi,"%20").replace(/\\/gi,"/")).split("/");

       var chkFile = arr[arr.length-1];

       var len = chkFile.length;

       var codeLen = 0;

 

       for (i=0; i < len; i++)

             (chkFile.charCodeAt(i) > 255)? codeLen+=2:codeLen++;

 

       if (len != codeLen) {

             alert("한글 파일은 업로드 없습니다.");

             return false;

       }

 

       if(fileName.length == 0 && fileName.length == 0){

             alert("업로드할 파일을 선택하십시오.");

             document.frm.f1.focus();

             return false;

       } else {

             document.frm.submit();

       }

}

</script>

</head>

<body>

<center>

<form name="frm" action="../cpnupload/insert.html" method="post" enctype="multipart/form-data" >

       <input type="file" id="f1" name="f1" size="30"/>

       <input type="button" style="width:80" value="확인" onclick="javascript:upload();">

</form>

${resultMessage }

</center>

 

</body>

</html>



4. 컨트룰러 제작
import java.io.File;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import org.springframework.web.multipart.MultipartFile;

import org.springframework.web.multipart.MultipartHttpServletRequest;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

 

public class CpnUploadController extends MultiActionController {

 

private Logger logger = Logger.getLogger(CpnUploadController.class);

private File uploadDir;

 

public void setUploadDir(File uploadDir) {

this.uploadDir = uploadDir;

}

 

public ModelAndView insert(HttpServletRequest request, HttpServletResponse response) throws Exception {

logger.debug("### CpnUploadController - insert()");

String resultMessage = "";

 

response.setContentType("text/plain");

if (! (request instanceof MultipartHttpServletRequest)) {

response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Expected multipart request");

return null;

}

 

MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; // 빈 업로드디렉토리 설정해 둔위치에 위치에 파일을 저장

MultipartFile imgFile = multipartRequest.getFile("f1");                                                   // request "f1" 찾아 file객체에 세팅한다.

final String imgFileName = imgFile.getOriginalFilename().trim();

String filePath = uploadDir.getAbsolutePath() + File.separator;

 

// 여기에 파일 중복 체크 추가

 

// 용량 체크

long fileSize = imgFile.getSize();

if(fileSize > 20480000 || fileSize <= 0) {

resultMessage = "20MB 이상의 파일은 업로드 없습니다.";

}

 

// 확장자 체크

int pathPoint = imgFileName.lastIndexOf(".");

String filePoint = imgFileName.substring(pathPoint + 1, imgFileName.length());

String fileType = filePoint.toLowerCase();

 

if(!fileType.equals("jpg") && !fileType.equals("bmp") && !fileType.equals("gif")) {

resultMessage = "이미지 파일만 업로드 가능합니다.";

}

 

// 파일을 지정한 위치에 upload

File f = new File(filePath + "64");

if(!f.exists()) {

f.mkdirs();         // 디렉토리 생성

}

 

String finalFnm = filePath + "64" + File.separator + imgFileName;

logger.debug("finalFnm = " + finalFnm);

imgFile.transferTo(new File(finalFnm));

resultMessage = "정상적으로 업로드 하였습니다.";

resultMessage += "\n저장된 파일 => " + finalFnm;

 

// 여기서 DB 파일을 포함한 쿠폰정보 저장

 

logger.debug("resultMessage = "+resultMessage);

ModelAndView mav = new ModelAndView("redirect:uploadForm.html");

mav.addObject("resultMessage", resultMessage);

return mav;

}

 

public ModelAndView uploadForm(HttpServletRequest request, HttpServletResponse response) {

logger.debug("### CpnUploadController - uploadForm()");

ModelAndView mav = new ModelAndView("/cpOper/cpn_upload");

String resultMessage = request.getParameter("resultMessage");

logger.debug("resultMessage = "+resultMessage);

mav.addObject("resultMessage", resultMessage);

return mav;

}

 

}

 끝.