FrontEnd
Axios를 이용하여 Excel Download 하는법 + blob (content-disposition 접근 오류 해결)
devOhzl
2024. 1. 23. 17:37
1. api 호출
아래는 엑셀 다운로드 api를 호출하면 리턴되는 형태이다.
blob 형태로 받기 위하여 responseType을 추가한다.
const getList = async() => {
const param = {
params: {
/* ... */
},
responseType: 'blob',
headers: {
'Content-Type': 'application/json'
}
}
const response = await axios.get($System.server.url + "/api/v1/account/downloadExcel", param);
return response;
}
api를 호출하면 blob 객체로 호출이 된다.
2. response, blob 객체 생성
받은 response로 blob 객체를 생성해줘야한다.
이때 type은 header의 content-type을 사용할 수 있다.
const res = await getList();
const blobData = new Blob([data], {
type: headers['content-type'],
})
3. <a> 태그를 사용한 엑셀 다운로드
createObjectURL을 사용하여 생성한 blob 객체를 가리킬 URL을 생성하고 <a> 태그의 href 속성으로 지정한다.
a 태그의 download 속성을 사용하여 저장할 파일의 이름을 설정한다.
마지막에 revokeObjectURL 속성으로 객체 URL을 해제시킨다.
const blobUrl = URL.createObjectURL(blobData)
const link = document.createElement('a')
link.href = blobUrl
link.download = res.headers['content-disposition']
.split('filename=')[1]
.split('.')[0]
link.click()
URL.revokeObjectURL(blobUrl)
** error : 'content-disposition' 읽지 못함 **
네트워크에서는 'Content-Disposition'에 filename이 들어오지만 응답 콘솔을 찍으니 접근하지 못하였다.
👉 해결
- Cache-Control
- Content-Language
- Content-Type
- Expires
- Last-Modified
- Pragma
이외의 header에 접근하기 위해서는 서버에서 Access-Control-Expose-Headers를 추가해줘야 접근할 수 있었다.
⚡ blob객체란 ?
단순 텍스트가 아닌 이미지, 사운드, 동영상, 파일 등 대용량 바이너리 데이터를 담을 수 있다.
이미지나 동영상 같은 큰 파일들을 메모리에 효율적으로 저장하고 전송할 수 있게 해주는 역할을 한다.
참고
https://www.chaerin.dev/Javascript/excel/