백엔드/Spring

[Spring] 파일 업로드

kwang2134 2024. 8. 25. 19:36
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