요르딩딩
[Personal_Project] 파일업로드 (단일/다중) (8) 본문
이번시간에는 파일을 업로드하는 방법을 적용해 보겠습니다.
단일 파일, 다중 파일을 각각 업로드 할 수 있도록 하겠습니다.
파일 업로드를 위해서 multipartResolver 인터페이스와 CommonMultipartResolver 구현체를 사용하겠습니다.
1. 파일 업로드를 위해 pom.xml에 아래와 같이 추가하여줍니다.
[pom.xml]
<!-- fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
2. 파일 업로드로 들어오는 데이터를 처리하기 위한 객체인 MultipartResolver 클래스를 Bean으로 등록하여 줍니다.
[dispatcher-servlet.xml]
<!-- 파일을 처리하기 위한 MultipartResolver 클래스를 bean으로 등록 -->
<!-- multipartResolver 인터페이스와 CommonsMultipartResolver 구현체 -->
<!-- 파일 업로드로 들어오는 데이터를 처리하는 객체 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
3. 화면을 출력해줄 jsp파일을 작성하여 줍니다.
- 단일/다중 파일 업로드 form을 각각 작성하였습니다.
- form태그의 action속성은 실행할 controller의 메소드명과 일치시켜주어야합니다.
- 다중 파일업로드의 경우는 input태그에 multiple속성을 추가해 주어야합니다.
[fileUpload.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<h1>File Upload (파일 업로드)</h1>
<!-- action의 값이 endpoint를 바라봅니다., enctype은 멀티파트 옵션을 줌 -->
<!-- form 태그의 enctype 속성은 multipart/form-data로 세팅하여 브라우져가 파일 업로드 방식으로 동작하도록 설정 -->
<form action="fileUpload" method="post" enctype="multipart/form-data">
<!-- input 태그 file 속성으로 작성하여 form 방식으로 파일 업로드를 할 수 있습니다.-->
<input type="file" name="uploadfile" placeholder="파일 선택" /><br />
<input type="submit" value="upload">
</form>
<h1>Multi File Upload (다중 파일 업로드)</h1>
<form action="multi_fileUpload" method="post" enctype="multipart/form-data">
<!-- multiple 속성추가 -->
<input type="file" name="uploadfiles" placeholder="파일 선택" multiple/><br/>
<input type="submit" value="upload">
</form>
</html>
4. Controller를 작성해 줍니다.
- 파일 업로드 화면(View)을 출력해줄 "fileUpload_jsp"
- 단일 파일 업로드를 해줄 "fileUpload"
- 다중 파일 업로드를 해줄 "multi_fileUpload"
- getOriginalFilename() :파일 이름을 String 값으로 반환한다.
- getSize() : 파일의 크기를 반환한다.
- jsp파일의 method속성을 post로 작성하였으므로, PostMapping으로 적어주어야 합니다.
[commonController.java]
/*
* 파일업로드 jsp
*/
@RequestMapping(value = "fileUpload_jsp") //jsp파일명이랑 이름이 같아야한다.
public String fileUploadJsp(MultipartFile uploadfile, Model model) throws Exception {
System.out.println("fileUpload_jsp");
return"fileUpload";
}
/*
* 8-1.파일업로드 서비스
*/
@PostMapping(value = "fileUpload") //jsp파일명이랑 이름이 같아야한다.
public String fileUpload(MultipartFile uploadfile, Model model) throws Exception {
//파일을 받을 수 있게끔 MultipartFile을 매개변수 선언
System.out.println("upload() POST 호출");
//파일 이름을 String 값으로 반환한다
System.out.println("파일 이름(uploadfile.getOriginalFilename()) : "+ uploadfile.getOriginalFilename());
//파일 크기를 반환한다
System.out.println("파일 크기(uploadfile.getSize()) : "+ uploadfile.getSize());
fileuploadService.saveFile(uploadfile);
return "fileUpload";
}
/*
* 8-2. 다중 파일업로드 서비스
*/
@PostMapping(value = "multi_fileUpload") //jsp파일명이랑 이름이 같아야한다.
public String multiFileUpload(MultipartFile[] uploadfiles, Model model) throws Exception {
//파일을 받을 수 있게끔 MultipartFile 배열을 매개변수 선언
for(MultipartFile f: uploadfiles) {
System.out.println("upload() POST 호출");
//파일 이름을 String 값으로 반환한다
System.out.println("파일 이름(uploadfile.getOriginalFilename()) : "+ f.getOriginalFilename());
//파일 크기를 반환한다
System.out.println("파일 크기(uploadfile.getSize()) : "+ f.getSize());
fileuploadService.saveFile(f);
}
return "fileUpload";
}
4. FileUploadService 인터페이스 작성
[FileUploadService.java]
import org.springframework.web.multipart.MultipartFile;
public interface FileUploadService {
public String saveFile(MultipartFile file);
}
5. FileUploadServiceImpl 작성
- 17,18줄 : 저장 할 폴더 경로에 파일이름이 중복되지 않게 uuid를 파일명 앞에 붙여주므로써 고유한 파일명을 가지도록 합니다.
- 23줄 : 저장될 경로와 파일이름을 가진 File객체를 생성
- 26줄 : 업로드될 파일(MultipartFile file)을 .transterTo() 메소드에 (경로,이름)File객체를 사용하여 파일을 저장합니다.
[FileUploadServiceImpl.java]
package com.service.serviceImpl;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.service.FileuploadService;
@Service("fileuploadService")
public class FileUploadServiceImpl implements FileuploadService {
public String saveFile(MultipartFile file) {
// 파일 이름 변경
UUID uuid = UUID.randomUUID();
String saveName = uuid + "_" + file.getOriginalFilename(); //서버상의 파일이름이 겹치는것을 방지
System.out.println("saveName: " + saveName);
// 저장할 File 객체를 생성(껍데기 파일)
File fileInfo = new File("/Users/jang/Downloads", saveName); // 저장할 폴더 경로, 저장할 파일 이름
try {
file.transferTo(fileInfo); // 업로드 파일에 fileInfo이라는 정보를 추가하여 파일을 저장한다.
} catch (IOException e) {
e.printStackTrace();
return null;
}
return saveName;
}
}
[전체화면]
[단일 파일업로드 화면]
[다중 파일업로드 화면]
'[Personal_Project]' 카테고리의 다른 글
[Personal_Project] 소캣(Client Socket/ Server Socket) (0) | 2021.07.28 |
---|---|
[Personal_Project] 환경별 배포 패키징 다르게하기(maven, resource, profile, pom.xml, jenkins) (1) | 2021.07.20 |
[Personal_Project] DI (필드, 수정자, 생성자)주입방법 (7) (0) | 2021.05.03 |
[Personal_Project] batch, scheduler 만들기 (6) (0) | 2021.05.02 |
[Personal_Project] 스프링 시큐리티 기초 (5) (0) | 2021.04.23 |