📤 File Upload란?

정의

File Upload는 사용자가 선택한 파일을 서버로 전송하고, 서버가 이를 저장하거나 처리하는 기능이다. 일반적으로 multipart/form-data 형식으로 전송한다.

🧩 업로드 처리 시 고려할 점

  • 파일 크기 제한을 설정해야 한다.
  • 허용 확장자를 검증해야 한다.
  • 파일명 충돌을 방지해야 한다.
  • 외부에서 업로드된 파일은 신뢰하지 말고 검증해야 한다.
  • 업로드 경로와 접근 경로를 분리하는 것이 좋다.

⚙️ Spring Boot 설정

application.yml

spring:
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 20MB

포인트

max-file-size는 개별 파일 크기 제한이고, max-request-size는 전체 요청 크기 제한이다.

🛠️ Spring Boot 업로드 예시

HTML 폼

<form method="post" enctype="multipart/form-data" action="/files/upload">
    <input type="file" name="file">
    <button type="submit">업로드</button>
</form>

Controller

@Controller
@RequestMapping("/files")
public class FileUploadController {

    private final Path uploadDir = Paths.get("uploads");

    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file) throws IOException {
        if (file.isEmpty()) {
            return "파일이 비어 있습니다.";
        }

        Files.createDirectories(uploadDir);

        String originalFilename = StringUtils.cleanPath(Objects.requireNonNull(file.getOriginalFilename()));
        String savedFilename = UUID.randomUUID() + "_" + originalFilename;
        Path targetPath = uploadDir.resolve(savedFilename);

        Files.copy(file.getInputStream(), targetPath, StandardCopyOption.REPLACE_EXISTING);

        return "업로드 완료: " + savedFilename;
    }
}

업로드 파일 정보 확인

@GetMapping("/info")
@ResponseBody
public String fileInfo(@RequestParam("file") MultipartFile file) {
    return "파일명: " + file.getOriginalFilename() + ", 크기: " + file.getSize();
}

🔒 검증 예시

if (!Objects.requireNonNull(file.getOriginalFilename()).endsWith(".png")) {
    throw new IllegalArgumentException("png 파일만 업로드할 수 있습니다.");
}

[!important] 주의 파일 확장자만으로 안전성을 판단하면 안 된다. 필요하면 MIME 타입, 내용 검사, 저장 경로 분리까지 함께 고려해야 한다.

📦 저장 방식

  • 로컬 디스크 저장
  • S3 같은 외부 스토리지 저장
  • DB에는 파일 자체보다 메타데이터만 저장

🧠 함께 보면 좋은 개념

  • Multipart
  • HTTP Request
  • WebServer

연결문서

댓글남기기