티스토리 뷰

 전 회사에서 Spring boot로 구축 시 모든 IN/OUT을 Api 문서 없이 Swagger로 적용하기로 했기에 들어오는 변수나 나가는 변수 모두를 VO로 작성해야만 했습니다. 다른 부분은 모두 문제없이 해결했는데 문제가 되는 부분은 바로 Multipart 였습니다. 파일을 넘겨야 하는데 @RequestParam 어노테이션으로 처리하면 Swagger에서는 json만 뜨고 멀쩡히 File upload가 안되고 @RequestPart로 하라고 해서 했더니 'org.apache.tomcat.util.http.fileupload.FileUploadException: the request was rejected because no multipart boundary was found' 와 같은 에러만 떨어졌습니다. 찾다 찾다보니 아래와 같은 방법이 있었습니다.

 

1. FileController(파일 처리하는 컨트롤러)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.be.common.controller;
 
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import com.be.service.FileService;
import com.be.vo.FileVo;
import com.be.vo.ResponseVo;
 
@RestController
@RequestMapping("/file")
@Tag(name = "파일 API", description = "파일에 쓰일 API 주소")
public class FileController {
    
    @Autowired
    private FileService service;
    
    @PostMapping(path = "/uploadfile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    @Operation(summary = "파일 업로드 API")
    public ResponseVo uploadfile(@ModelAttribute @Valid FileVo fileVo) throws Exception {
        return service.saveMultifileRes(fileVo);
    }
}
 
cs

2. FileVo(파일을 받을 Vo)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.be.common.vo;
 
import java.util.ArrayList;
 
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
 
import org.springframework.web.multipart.MultipartFile;
 
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
 
@Data
@Schema(title = "파일 Vo")
public class FileVo {
    private String flId;
    private String seq;    
    private String upPath;
    @Schema(title = "멀티파트 File Arrya", description = "멀티 파트 File Array")    
    private ArrayList<MultipartFile> files;
    private String flNm;
    private String flSize;
}
 
cs

 

 위와 같이 ModelAttribute로 처리하게 되면 문제가 발생하지 않게 됩니다. 참고로 FileVo를 그대로 Response로 내리면 error가 발생하니 MultipartFile을 Null처리하던거 해서 비워주는 처리가 필요하니 참고하시기 바랍니다. 

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday