반응형
환경: springboot 2.7.3, /resources 안에 든 .xlsx 파일을 다운로드할 수 있는 api 제공
@GetMapping("/format")
public void downloadExcelFormat(HttpServletResponse response) throws Exception {
try (InputStream inputStream = new ClassPathResource("mail_format.xlsx").getInputStream()) {
response.setHeader("Content-Disposition", "attachment; filename=\"mail_format.xlsx\"");
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
try (ServletOutputStream outputStream = response.getOutputStream()) {
IOUtils.copy(inputStream, outputStream);
}
}
}
- resources 경로의 파일은 ClassPathResource로 읽을 수 있음
- 파일을 input stream으로 읽고 output stream으로 return
vue2에서 호출할 때는 아래와 같이 해야한다.
getFormatDownload() {
ApiMail.getMailFormat().then((response) => {
const url = URL.createObjectURL(
new Blob([response.data], {
type: 'application/vnd.ms-excel',
})
);
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', 'mail_format.xlsx');
document.body.appendChild(link);
link.click();
});
}
--------
export const getMailFormat = (): Promise<AxiosResponse> => {
const axiosOptions: AxiosOptionsParam = {
method: 'GET',
url: '/api/mail/format',
responseType: 'arraybuffer',
};
return asyncWithoutWrapper(axiosOptions);
};
--------
export async function asyncWithoutWrapper<T>(params: AxiosOptionsParam): Promise<AxiosResponse<T>> {
const axiosOptionsParams: AxiosRequestConfig = createAxiosOptions({
...params,
});
const response: AxiosResponse<T> = await axios(axiosOptionsParams);
return Promise.resolve(response);
}
- 응답 값을 Blob으로 감싸고 형식이 excel인지 알려줘야 함
- axios param에 responseType을 'arraybuffer' 로 세팅해야 함
728x90
반응형
'개발 > spring' 카테고리의 다른 글
[spring-jpa] inner class constructor (0) | 2022.12.09 |
---|---|
[ExceptionHandler] 컨트롤러 에러처리 (0) | 2022.11.23 |
[request part] file upload (0) | 2022.10.31 |
[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 |