반응형
환경: springboot 2.7.3
implementation 'org.apache.poi:poi:5.2.2'
implementation 'org.apache.poi:poi-ooxml:5.2.2'
implementation 'commons-io:commons-io:2.11.0' //확장자 검사
화면 -> 웹서버로 파일 업로드를 할 때,
- POST요청으로
- rest api 사용(form submit 아님)
- 파일(Multipartfile)과 본문 내용(RequestBody)을 동시에 보낼 경우
@RequestPart 어노테이션을 사용하면 둘 다 한 요청으로 보낼 수 있다.
public BaseResponse sendFile(
@Valid @RequestPart SendRequest request,
@RequestPart MultipartFile csvFile)
다만 swagger(open-api)에서 테스트하는 경우 헤더 관련 에러가 나는데
아래와 같이 @Parameter 어노테이션으로 binary로 받겠다고 하고
@PostMapping(
value = "/send-file",
consumes = {MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_JSON_VALUE})
@Operation(summary = "우편물 발송 > 파일 업로드", description = "우편 작성 > 우편 발송 api")
public BaseResponse sendFile(
@Valid @RequestPart @Parameter(schema = @Schema(type = "string", format = "binary"))
SendRequest request,
@RequestPart MultipartFile csvFile) {
스웨거에서 body부분을 json 파일로 만들어 첨부하면 된다.
+ 추가
만약 vue/js 화면 등에서 이 api를 호출하려면?
@RequestPart에 해당하는 값을 formData에 넣어서 보내야한다.
또한 헤더에 multipart/form-data를 실어야 한다.
아래는 vue2+ts 예시
export const sendFile = (params: SendRequest, file: File): Promise<Response<void>> => {
const body = new FormData();
body.append(
'request',
new Blob([JSON.stringify(params)], {
type: 'application/json',
})
);
body.append('file', file);
const axiosOptions: AxiosOptionsParam = {
method: 'POST',
url: '/api/mail/send-file',
data: body,
header: {
'content-type': 'multipart/form-data',
},
};
return http<void>(axiosOptions);
};
728x90
반응형
'개발 > spring' 카테고리의 다른 글
[ExceptionHandler] 컨트롤러 에러처리 (0) | 2022.11.23 |
---|---|
[web] file download inside jar (0) | 2022.11.02 |
[spring-jpa] mysql, use json(db) function in @Query (0) | 2022.10.25 |
[transaction] why do we need read-only transaction? (0) | 2022.09.21 |
[spring-jpa] @Transactional saveAll (0) | 2022.08.03 |