안녕하세요, 이번 포스팅에서는 Spring MVC를 이용해 웹사이트 구축시 다중파일 업로드
를 구현해야하는 상황에서, 발생했던 간단한 팁을 알아보려고 합니다.
유연한 다중파일 업로드 핸들러
1. 일반적인 파일 업로드 핸들러
일반적인 경우 다중파일 업로드를 위해서 위와 같이 핸들러를 만들게 됩니다. 중요한 점은 RequestParam(key)
의 괄호안의 key값과, form을 이용해 파일을 업로드할때의 key값이 일치해야 한다는 점입니다.
그러면, @RequestParam
의 괄호 안에 적힌 (file1, file2)
에 사용자가 form을 통해 업로드하는 파일들이 각각 맵핑됩니다. (Postman을 이용해 form을 제출했습니다.)
문제점
위에서 구현한 핸들러는 두가제 문제를 안고있습니다.
- 업로드할 파일의 수가 변경된다면, 핸들러를 같이 수정해야 합니다.
- 업로드하는 사용자가 form에 file key값을 다르게 입력할 시 핸들러에서 파일을 제대로 받지 못하는 에러가 발생할 수 있습니다.
2. Map을 이용한 유연한 다중파일 업로드 핸들러 구현
앞선 핸들러는 변경에 상당히 취약한 구조를 취하고 있습니다. 그렇다면 변경하는 부분을 캡슐화하여 유연한 핸들러를 만들어야겠죠 ?
방법은 상당히 간단합니다. Spring에서는 이미 업로드되는 파일의 키, 파일
쌍을 Map으로 변환하는 Converter를 구현하고 있기 때문에, 다중 파일 업로드시, @RequestParam
에 Maping될 매개변수로 Map<String, MultipartFile>
을 사용하면 됩니다.
마찬가지로 Postman을 이용해 form제출 테스트를 합니다. 중요한 점은 key값은 클라이언트가 임의대로 해도 된다는점과, file의 수가 몇개든지 핸들러에서 처리가 가능하다는 점입니다.
성공입니다.
*3. Client에서 이미지파일을 업로드할때의 규격 (ex . javascript)
{
uri: imageUri
type: 'image/jpg',
name: 'image.png'
}
클라이언트 측에서 요청할때, 업로드한 image를 MultiparFile로 올바르게 맵핑되기 위해서는, 각각의 image가 위의 형식을 준수해야 합니다.
const formData = new FormData();
formData.append("image1": {
uri: imageUri
type: 'image/jpg',
name: 'image.png');
fetch(SERVER_URI, {
method: "POST",
body: formData
});
javascript에서 image를 업로드하는 코드입니다.
'FrameWork > Spring MVC' 카테고리의 다른 글
Spring MVC - @ModelAttribute의 장점(@RequestParam와 @ModelAttribute) (8) | 2020.08.15 |
---|---|
Spring MVC - form 요청을 핸들러의 매개변수로 맵핑(map form data to handler argument) (0) | 2020.06.07 |
SpringMVC - @RequestBody로 Timestamp 전달하기 (@JsonFormat : timezone 설정, 입력형식 정하기) (0) | 2019.07.25 |
SpringMVC - 핸들러 메소드 9 (Exception 처리 Handler(개발자 정의)) (0) | 2019.06.22 |
SpringMVC - Spring JDBC에서 Mysql에 날짜/시간 데이터 입력 (3) | 2019.06.09 |