개요
브라우저에서 서버로 파일 보내려면 기본적으로 멀티파트라는걸 써야 하는데 멀티파트가 뭔지 에대해서 찾아보았다.
메모
<form method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile">
<button type="submit">업로드</button>
</form>요런식으로 form 태그에 multipart/form-data 라고 써줘야 파일전송이 됩니다. 그냥 form 으로는 텍스트만 보낼 수 있음
파일이 전송되는 과정을 보면 이런 느낌임
sequenceDiagram participant 브라우저 participant 서버 브라우저->>서버: 1. 파일 선택해서 전송 Note over 브라우저,서버: multipart/form-data로 쪼개서 전송 서버->>서버: 2. 파일 조각 모아서 저장 서버-->>브라우저: 3. 업로드 완료 응답
실제 구현은 이렇게 하면 됨
스프링에서는 요런 느낌으로 구현하면 됨
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
try {
// 1. 파일 저장할 경로 정하기
String uploadDir = "uploads/";
// 2. 파일명 중복 방지
String fileName = UUID.randomUUID() + "_" + file.getOriginalFilename();
// 3. 실제 파일 저장
file.transferTo(new File(uploadDir + fileName));
return "업로드 성공함";
} catch(Exception e) {
return "업로드 실패함 ㅠ";
}
}이러면 끝인데 실제로는 예외처리랑 파일 용량 제한같은것도 해줘야 됨
주의할 점
- 파일 크기 제한 걸어두기 (보통 10MB 정도)
- 확장자 검사해서 이상한 파일 거르기
- 파일명에 이상한 문자 들어있는지 체크하기
저장할 때 UUID 써서 중복 방지하기 이정도만 하면 기본적인 파일 업로드는 됨