스프링 프레임 환경에서 파일 업로드 하는 법을 기록하도록 하겠다.
먼저
에 접속하도록 하자
fileupload라고 치면 이러한 결과가 나온다
commons-fileupload의 버전명을 클릭하자
그러면 이러한 화면이 나온다
우리는 아파치 메이븐을 사용할 것이므로 저 코드를 복사하여 pom.xml에 붙인다.
귀찮은 사람들을 위해 여기도 남긴다.
<!-- 파일 업로드 처리를 위한 라이브러리 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
이제 라이브러리 추가는 됬고
dispatcher-servlet.xml 을 찾아가자 (intellij의 경우 servlet-context.xml)
<!-- 브라우저가 multipart/form-data 데이터로 보내는
파일을 처리하기 위한 MultipartResolver 클래스를 bean으로 등록 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
빈즈 안에 위와 같은 코드를 쳐놓는다.
스프링이 멀티파트 영역을 관리하게끔 빈으로 설정해놓는것이다.
코드를 만들어보자.
jsp를 만들어서 아래와 같은 코드를 만들어보았다.
<h1>파일 업로드</h1>
<form action="fileupload", method="post" enctype="multipart/form-data">
<input type="file", name="uploadfile" placeholder="파일 선택" /><br/>
<input type="submit" value="업로드">
</form>
다른접이 있다면 enctype으로 멀티파트 옵션을 준것이다.
이 코드의 결과는 아래와 같다.
파일 선택 클릭을 하면 아래와 같은 창이 뜬다.
적당히 이미지 파일을 하나 클릭하고 보내보자
나는 post 컨트롤러를 아래와 같이 구현했다.
@RequestMapping(value = "/fileupload",method = RequestMethod.POST)
public void upload(MultipartFile uploadfile){
logger.info("upload() POST 호출");
logger.info("파일 이름: {}", uploadfile.getOriginalFilename());
logger.info("파일 크기: {}", uploadfile.getSize());
saveFile(uploadfile);
}
private String saveFile(MultipartFile file){
// 파일 이름 변경
UUID uuid = UUID.randomUUID();
String saveName = uuid + "_" + file.getOriginalFilename();
logger.info("saveName: {}",saveName);
// 저장할 File 객체를 생성(껍데기 파일)ㄴ
File saveFile = new File(UPLOAD_PATH,saveName); // 저장할 폴더 이름, 저장할 파일 이름
try {
file.transferTo(saveFile); // 업로드 파일에 saveFile이라는 껍데기 입힘
} catch (IOException e) {
e.printStackTrace();
return null;
}
return saveName;
} // end saveFile(
먼저 스프링이 파일을 받을 수 있게끔 멀티파트파일로 매개변수를 선언하고
파일의 존재를 확인하기 위해 로그를 찍어봤다.
다음에는 서버상의 파일의 이름이 겹치는 것을 방지하기 위해
uuid를 사용하여 파일 이름 앞에 랜덤값을 집어넣어서 저장하도록 했다.
그리고 파일의 경로와 이름을 지정하기 위해
saveFile이라는 껍데기 파일을 하나 만들고 업로드한 파일에 transferTo라는 메소드를 이용하여
껍데기를 씌웠다.
FileCopyUtils.copy(file.getBytes(),saveFile);
transferTo 대신 위의 메소드를 사용해도 된다.
UPLOAD_PATH는 저장 경로이다. 나의 경우 아래와 같다.
private static final String UPLOAD_PATH = "C:\\Study\\fileupload";
이렇게 해서 저장을 하면
아래와 같이 저장이 잘 되는 모습을 확인할 수 있다.
마지막으로 파일 업로드 성공 여부를 확인하려면
@RequestMapping(value = "/fileupload",method = RequestMethod.POST)
public void upload(MultipartFile uploadfile, Model model){
logger.info("upload() POST 호출");
logger.info("파일 이름: {}", uploadfile.getOriginalFilename());
logger.info("파일 크기: {}", uploadfile.getSize());
String result = saveFile(uploadfile);
if(result !=null){ // 파일 저장 성공
model.addAttribute("result", result);
} else { // 파일 저장 실패
model.addAttribute("result","fail");
}
}
위의 코드를 조금 수정한 것이다.
jsp로 보내줄 model 객체를 매개변수로 선언하고
saveFile 메소드의 리턴값이 null(업로드 실패)일 경우
model에 attribute를 fail로 추가하고, 성공할 경우(null이 아닐 경우)는 result(파일의 이름)을 보내주면
받는 jsp에서는 아래와 같은 식으로 이를 받아 확인할 수 있을 것이다.
<script>
$(document).ready(function () {
if(${not empty result}){
alert('${result} 파일 저장 성공');
} else {
alert('파일 저장 실패');
}
})
</script>
결과 화면
여기까지가 단일 파일 업로드였고
다중 파일 업로드는 위의 과정만 알면 간단하기에
복사붙여넣기만 한다.
<h2>다중 파일 업로드</h2>
<form action="fileupload2", method="post" enctype="multipart/form-data">
<input type="file", name="uploadfiles" placeholder="파일 선택" multiple/><br/>
<input type="submit" value="업로드">
</form>
@RequestMapping(value = "/fileupload2", method = RequestMethod.POST)
public String upload(MultipartFile[] uploadfiles, Model model){
String result = "";
for(MultipartFile f : uploadfiles){
result += saveFile(f);
}
model.addAttribute("result",result);
return "fileupload";
}
saveFile 메소드는 위의 saveFile 메소드와 같다.
'프로그래밍 > Web-Spring' 카테고리의 다른 글
스프링 프레임워크 - Junit Test (0) | 2018.02.04 |
---|---|
Spring에서 mybatis 사용법 (0) | 2017.11.25 |
Spring 프레임워크에서 Oracle을 사용하기 (1) | 2017.11.15 |