반응형

환경: 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
반응형

+ Recent posts