파일 업로드
스프링 사전 설정
1. pom.xml에 commons-fileupload 라이브러리를 추가합니다.
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3</version>
</dependency>
2. servlet-context.xml에 파일 업로드 처리를 위한 빈을 설정합니다.
<beans:bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="maxUploadSize" value="104857600" /> //단위 : 바이트 ->100MB
<beans:property name="maxUploadSizePerFile"
value="20971520" /> //20MB
<beans:property name="defaultEncoding" value="utf-8" />
</beans:bean>
파일 업로드를 여러 개 할 때 최대 크기, 파일 1개에 대한 최대 크기 제한을 설정합니다.
3. jsp 파일(view)에서 form 태그와 input 태그를 작성합니다.
<form action="gallery" method="post" enctype="multipart/form-data">
<input type="text" name=title placeholder="제목 입력하세요."><br>
이미지 파일을 선택하세요.(최대 3개)<br>
<input type="file" name="pics" accept="image/*"><br>
<input type="file" name="pics" accept="image/*"><br>
<input type="file" name="pics" accept="image/*"><br>
<button>전송</button>
</form>
전송방식은 post로 설정해야합니다.
enctype 속성값을 'multipart/form-data'로 지정합니다.
<input> 태그
type 속성은 'file'로 합니다.
accept 속성으로 서버로 업로드할 수 있는 파일의 타입을 명시합니다.
* MIME 타입 : 웹에서 사용하는 파일의 종류입니다. (multipart/form-data, image/*, application/pdf 등)
4. controller에 전송받은 파일을 저장할 경로를 지정합니다.
@Controller
public class GalleryController {
@PostMapping("gallery")
public void upload(Gallery vo,Model model) {
String path = "c:\\upload";
}
}
MultipartFile 인터페이스
파일 처리는 MultipartFile 타입으로 합니다.
MultipartFile의 메소드
메소드 | 설명 |
String getOriginalFileName( ) | 업로드되는 파일의 이름을 리턴합니다. |
long getsize( ) | 업로드되는 파일의 크기를 리턴합니다. |
transferTo(File file) | 파일을 저장합니다. |
Model (Gallery.java)
public class Gallery {
private String title;
private List<MultipartFile> pics;
}
MultipartFile은 form 요소의 file을 전달 받아 참조합니다.
View (gallery.jsp)
<h3>파일 업로드 테스트</h3>
<hr>
<form action="gallery" method="post" enctype="multipart/form-data">
<input type="text" name=title placeholder="제목 입력하세요."><br>
이미지 파일을 선택하세요.(최대 3개)<br>
<input type="file" name="pics" accept="image/*"><br>
<input type="file" name="pics" accept="image/*"><br>
<input type="file" name="pics" accept="image/*"><br>
<button>전송</button>
</form>
<hr>
<!-- 서버에 업로드된 이미지 파일을 view(화면,클라이언트,jsp)에서 접근하려면
url이 필요합니다. c:/upload 서버 폴더에 파일을 저장했으나 클라이언트에서는 폴더로
접근하는 것이 아니고 url(예, /upload)로 접근해야 합니다. server.xml에서 설정합니다.
-->
<c:forEach items="${list }" var="vo">
<div>
<img src="/upload/${vo}" width="400px" height="400px"
style="object-fit:cover">
</div>
</c:forEach>
업로드한 이미지를 화면에 출력합니다.
Controller에서 애트리뷰트 list를 받아와 forEach문을 실행합니다.
Controller (GalleryController.java)
@Controller
public class GalleryController {
@GetMapping("gallery")
public void view() {
}
@PostMapping("gallery")
public void upload(Gallery vo,Model model) {
String path = "c:\\upload"; // \는 출력 문자열로 지정할 때는 두번씁니다.
//view로 전달할 파일명 리스트
List<String> list = new ArrayList<>();
//서버에 전송된 내용 확인 테스트
logger.info("title: "+vo.getTitle());
for(MultipartFile f : vo.getPics()) {
logger.info("파일명 : "+f.getOriginalFilename()); //전송받은 파일 명
logger.info("파일 크기 : "+f.getSize()); //전송받은 파일 크기
logger.info("랜덤 문자열 : "+UUID.randomUUID().toString());
// File sfile = new File(path+"\\"+f.getOriginalFilename());
if(f.getSize()!=0) {
String temp = f.getOriginalFilename();
String ext = temp.substring(temp.indexOf('.'),temp.length());
String newfile = UUID.randomUUID().toString().substring(0, 8)+ext;
File sfile = new File(path+"\\"+ newfile);
try {
f.transferTo(sfile);
list.add(newfile);
} catch (IllegalStateException | IOException e) {
logger.info("파일 전송 오류 : "+e.getMessage());
e.printStackTrace();
}
}
}
model.addAttribute("list",list);
}
}
Model 의 getPics 메소드로 업로드한 파일을 가져와 MultipartFile 타입으로 빠른 for문을 실행합니다.
UUID 클래스의 randomUUID( ).toString( ) 메소드로 랜덤 문자열을 생성합니다.
getOriginalFilename( )은 여러 접속자(사용자)가 중복된 이름을 사용할 수 있기 때문에 랜덤 문자열을 이용합니다.
File 객체를 생성하고 경로를 지정합니다.
업로드된 파일의 크기가 0이 아니라면 transferTo(File file) 메소드로 서버에 저장할 파일 객체를 전송합니다.
파일 이름을 list에 추가하고 Model 객체로 애트리뷰트 list에 저장합니다.
실행 결과
파일을 선택하고 전송 버튼을 누릅니다.
콘솔창
화면에 업로드한 이미지가 출력됩니다.
upload 폴더에 파일이 저장되었습니다.
후에 알아볼 것
object-fit
image slide - 슬라이드
round image - 둥근 이미지(프로필 사진)
Controller 새로운 파일명 - 중복을 최소화하려면 랜덤 문자열 길이를 늘리기
'수업 일지 > Spring' 카테고리의 다른 글
68일차 - [Spring] 게시판 기능 구현 (0) | 2022.04.14 |
---|---|
67일차 - [Spring] 게시판 페이징 처리 (0) | 2022.04.13 |
65일차 - [Spring] Model/@ModelAttribute/@SessionAttribute (0) | 2022.04.11 |
64일차 - [Spring] 서블릿/MVC 패턴 (0) | 2022.04.08 |
63일차 - [Spring] spring 트랜잭션/빌더 패턴/JUnit 테스트 케이스 (0) | 2022.04.07 |
댓글