[작성일: 2023. 05. 20]
File Upload 방식
- <form> 태그를 이용하는 방식과 Ajax를 이용하는 두 가지 방식이 있음.
File Upload 폴더 생성
- C:upload/temp
application.properties
- multipart 부분 추가
- file upload API
cos.jar: 2002년 이후 개발 종료되었으며 더 이상 사용하지 않을 것을 권장함.- commons-fileupload : 일반적으로 많이 활용, 서블릿 3.0 이전도 사용 가능
- 서블릿 3.0 이상에서는 API 상에서 지원
# multipart
spring.servlet.multipart.enabled=true
spring.servlet.multipart.location=C:upload/temp
spring.servlet.multipart.max-file-size=40MB
spring.servlet.multipart.max-request-size=20MB
spring.servlet.multipart.file-size-threshold=100MB
UploadController.java
- Ajax 방식으로 호출 시에는 결과를 기다리지 않기 때문에 제어권을 컨트롤러에 넘기지 않음.
@PostMapping("uploadFormAction")
public void uploadFormPost(MultipartFile[] uploadFile, Model model){
}
@PostMapping("uploadAjaxAction")
public void uploadAjaxPost(MultipartFile[] uploadFile, Model model){
}
개선사항
- 동일한 이름으로 파일 업로드가 수행되면 기존 파일이 사라짐.
- 1단계 : 업로드 디렉토리에 년/월/일 디렉토리 생성
- 2단계 : 동일 일자에 동일 이름인 파일에 대한 처리를 위해 특수 아이디(UUID) 기법 적용
- Universally unique identifier : 범용 고유 식별자
- 340,282,366,920,938,463,463,374,607,431,768,456개(10의 38제곱)
- 이미지 파일의 원본이 큰 경우 썸네일을 생성할 필요가 있음.
- Thumbnailator 라이브러리 사용
- pom.xml에 dependency 추가
- 이지피 파일과 일반 파일을 구분해서 다운로드 하거나 조회해야 함.
- Files.probeContentType()을 활용하여 image/ , text/ 등의 타입을 구분할 수 있음.
- image로 시작되면 image로 판단
- checkImageType() 구현
- 첨부파일 해킹공격에 대비하기 위한 업로드 파일 확장자를 제한해야 함.
- checkExtension()
- fileName의 Regular Expression Check
- fileSize Over Check
첨부파일 활용
- 첨부파일을 활용하기 위한 VO(AttachFileVO) 적용
- com.it.example.beans.vo에 VO 생성
- uploadAjax.html에서 요청한 등록 결과를 돌려주기 위함.
- uploadAjaxPost 변경
- uploadAjax.html에서 이미지인 경우와 아닌 경우 처리 분리, 이미지인 경우에는 display 서비스를 호출하여 썸네일 이미지 수신
- 이미지가 아닌 경우에는 사전에 준비된 attach.png를 사용
- display 서비스를 위해서 getFile 메서드 추가
🐣 해당 게시글은 입문 개발자가 요약/정리한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.