728x90
728x90
Spring 파일 업로드
- HTML Form 전송 방식을 통한 파일 전송
- 파일만 전송하지 않음 -> 추가적인 다른 정보와 함께 전송
- 다른 타입의 데이터를 동시에 전송 -> 문자(정보) + 바이너리(파일)
- multipart/form-data 전송 방식 제공
HTML Form 데이터 전송 - multipart/form-data
- Form 태그에 enctype="multipart/form-data" 지정
- 다른 종류의 여러 파일과 폼의 내용을 함께 전송 가능
- 각각 전송 항목이 구분되어 항목별 헤더인 Content-Disposition 추
- 일반 데이터는 항목 별로 데이터 전송
- 파일의 경우 파일 이름과 Content-Type이 추가되고 바이너리 데이터 전송
서블릿과 파일 업로드
- HttpServletRequest의 getParts()를 통해 각각의 멀티 파츠 정보를 얻을 수 있음
- spring.servlet.multipart.enabled 옵션이 켜져 있으면 스프링 DispatcherServlet에서 MultipartResolver를 실행
- MultipartResolver는 멀티 파츠 요청일 경우 일반 HttpServletRequest를 MultipartHttpServletRequest로 변환하여 반환
- 주요 메서드
- part.getSubmittedFileName(): 클라이언트가 전달한 파일명
- part.getInputStream(): Part()의 전송 데이터
- part.write(...): Part()를 통해 전송된 데이터 저장
Spring 파일 업로드
- MultipartFile 인터페이스로 편리하게 지원
- @RequestParam을 사용하여 Multipart 요청이 들어온 경우 값들이 자동으로 할당
- 클라이언트가 업로드한 파일 명과 서버 내부에서 관리하는 파일 명을 다르게 관리 -> 중복 우려
- UUID나 특별한 값을 사용해 서버 내부에 저장할 파일 이름을 관리
- 확장자를 추출하여 서버 내에 저장될 파일 명에도 붙여서 관리 -> 파일 구분 용이
- 템플릿 내 multiple="multiple" 옵션을 사용해 다중 파일 업로드 가능
- 주요 메서드
- file.getOriginalFilename(): 업로드 파일 명
- file.transferTo(...): 파일 저장
- application.properties 또는 application.yml 파일을 통해 파일 업로드 크기를 제한 가능
- spring.servlet.multipart.max-file-size: 단일 파일의 최대 크기
- spring.servlet.multipart.max-request-size: 요청당 최대 파일 크기
파일 저장 위치
- 업로드된 파일은 서버의 특정 디렉토리에 저장
- 상대 경로와 절대 경로 중 선택 가능
- 상대 경로: 애플리케이션의 현재 작업 디렉토리를 기준으로 설정
- 절대 경로: 파일 시스템의 전체 경로를 지정
보안 고려사항
- 파일 확장자 검증: 허용된 확장자만 업로드 가능하도록 제한
- 파일 내용 검증: 파일의 실제 내용과 확장자가 일치하는지 확인
- 악성 코드 스캔: 업로드된 파일에 대해 바이러스 검사 수행
- 파일명 정제: 경로 조작 공격을 방지하기 위해 파일명에서 특수 문자 제거
파일 다운로드
- 업로드된 파일을 다운로드 가능
- Content-Disposition 헤더를 사용하여 다운로드 파일명 지정
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 강의 | 김영한 - 인프런 (inflearn.com) 강의 내용 참고
728x90
'백엔드 > Spring' 카테고리의 다른 글
[Spring] 커넥션 풀 (0) | 2024.08.27 |
---|---|
[Spring] JDBC (0) | 2024.08.26 |
[Spring] 스프링 타입 컨버터 Spring TypeConverter (0) | 2024.08.24 |
[Spring] 검증 Bean Validation (0) | 2024.08.20 |
[Spring] 검증 Validation (0) | 2024.08.19 |