상세 컨텐츠

본문 제목

AJAX 파일(blob)다운로드 사용법 정리(axios,fetch,jquery, vanilla)

자바스크립트

by e7e 2025. 3. 20. 12:50

본문

AJAX로 직접 파일을 받아서 쓰는 건 생각보다 훨씬 유용하지 않을 수 없당.

잘 쓰지 못해서 안 쓸 뿐, 이번 기회에 정리해서 다시는 날개를 접지 말장

 

sample1.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>E7E E7E</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.8.4/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
</head>
<body>
<script>
// 샘플 이미지 주소 내 맘은 카리나
const testURL = "https://media.nudge-community.com/8227404";
// AXIOS
async function axiosFileDownload(url) {
const resp = await axios.get(url, { responseType: "blob" });
let aTag = document.createElement("a");
aTag.href = URL.createObjectURL(resp.data);
aTag.download = "axios.gif";
aTag.click();
}
axiosFileDownload(testURL);
//FETCH
async function fetchFileDownload(url) {
const resp = await fetch(url);
let aTag = document.createElement("a");
aTag.href = URL.createObjectURL(await resp.blob());
aTag.download = "fetch.gif";
aTag.click();
}
fetchFileDownload(testURL);
// JQUERY AJAX
$.ajax({
url: testURL,
xhrFields: {
responseType: "blob",
},
success: (rslt) => {
let aTag = document.createElement("a");
aTag.href = URL.createObjectURL(rslt);
aTag.download = "jquery.gif";
aTag.click();
},
});
// Vanilla JS
function vanillaAjax() {
const xhr = new XMLHttpRequest();
xhr.open("get", testURL, true);
xhr.responseType = "blob";
xhr.onload = (rslt) => {
let aTag = document.createElement("a");
aTag.href = URL.createObjectURL(xhr.response);
aTag.download = "vanilla.gif";
aTag.click();
};
xhr.send();
}
vanillaAjax();
</script>
</body>
</html>

실행 해보면 자동으로 파일4개가 다운됨을 알수 있당.

[만약 console에 Cross-Origin 에러가 났다면 브라우져 플러그인 Cross-Origin을 실행하장

 참고로 이 브라우져 플러그인은 그리 안정적이진 못하다 별 3개 반.]

 

위 코드는 자세히 보면 a  태그 만들고 하는 부분이 반복이 심하당.

이럴땐 머리에 DRY(Do not Repeat Yourself) 원칙

KISS(Keep It Simple, Stupid) 원칙이 생각나면 아름다운 후광이당.

 

사포로 조금 손질 좀 해보장.

sample2.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>E7E 272</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.8.4/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
</head>
<body>
<script>
// 샘플 이미지 주소 내 맘은 카리나
const testURL = "https://media.nudge-community.com/8227404";
// 공통 부분 함수화
function downBlob(blob, filename) {
console.log(`체킁 ${filename}`, blob);
let aTag = document.createElement("a");
aTag.href = URL.createObjectURL(blob);
aTag.download = filename;
aTag.click();
URL.revokeObjectURL(blob); // 권장 메모리에 남아있는 거 해제, 안 하는 사람 더 많음
}
// AXIOS
async function axiosFileDownload(url) {
const resp = await axios.get(url, { responseType: "blob" });
downBlob(resp.data, "axios1.gif");
}
axiosFileDownload(testURL);
//FETCH
async function fetchFileDownload(url) {
const resp = await fetch(url);
downBlob(await resp.blob(), "fetch1.gif");
}
fetchFileDownload(testURL);
// JQUERY AJAX
$.ajax({
url: testURL,
xhrFields: {
responseType: "blob",
},
success: (rslt) => {
downBlob(rslt, "jquery2.gif");
},
});
// Vanilla JS
function vanillaAjax() {
const xhr = new XMLHttpRequest();
xhr.open("get", testURL, true);
xhr.responseType = "blob";
xhr.onload = (rslt) => {
downBlob(xhr.response, "vanilla2.gif");
};
xhr.send();
}
vanillaAjax();
</script>
</body>
</html>

결과는 이전과 똑같지 않지 않을 이유를 찾을 수 없지 않지 않을 수 없더라.

 

 

아주 자주 서버에서 받은 파일을 바로 다운로드 시키지 않고

화면에 넣은 다음 클릭시 다운로드를 해줘야 할 때가 분명 없지 않지 않다.

소스 맨끝에 덤으로 넣었당. 

sample3.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.8.4/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
</head>
<body>
<div id="disp"></div>
<script>
const disp = document.querySelector("#disp");
// 샘플 이미지 주소 내 맘은 카리나
const testURL = "https://media.nudge-community.com/8227404";
function downBlob(blob, filename) {
console.log(`체킁 ${filename}`, blob);
let aTag = document.createElement("a");
aTag.href = URL.createObjectURL(blob);
aTag.download = filename;
aTag.click();
URL.revokeObjectURL(blob); // 권장 메모리에 남아있는 거 해제, 안 하는 사람 더 많음
}
// AXIOS
async function axiosFileDownload(url) {
const resp = await axios.get(url, { responseType: "blob" });
downBlob(resp.data, "axios3.gif");
}
axiosFileDownload(testURL);
//FETCH
async function fetchFileDownload(url) {
const resp = await fetch(url);
downBlob(await resp.blob(), "fetch3.gif");
}
fetchFileDownload(testURL);
// JQUERY AJAX
$.ajax({
url: testURL,
xhrFields: {
responseType: "blob",
},
success: (rslt) => {
downBlob(rslt, "jquery3.gif");
},
});
// Vanilla JS
function vanillaAjax() {
const xhr = new XMLHttpRequest();
xhr.open("get", testURL, true);
xhr.responseType = "blob";
xhr.onload = (rslt) => {
downBlob(xhr.response, "vanilla3.gif");
};
xhr.send();
}
vanillaAjax();
// 이건 덤으로 다운받은 파일 화면에 넣고, 클릭하면 다운받깅
// 이건 1개만 axios를 이용해서
async function axiosDum(url) {
const resp = await axios.get(url, { responseType: "blob" });
const domUrlString = URL.createObjectURL(resp.data);
const imgTag = document.createElement("img");
imgTag.src = domUrlString;
imgTag.width = 300;
imgTag.height = 300;
imgTag.style.borderRadius = "50%";
const aTag = document.createElement("a");
aTag.href = domUrlString;
aTag.download = "메롱.gif";
aTag.appendChild(imgTag);
disp.appendChild(aTag);
}
axiosDum(testURL);
</script>
</body>
</html>

 

무언가 심심하단 느끼미가 연타로 나의 브레인을 재미없다 모략한당.

sample4.html (재미용 animation 추가, 이거시 최종버젼)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.8.4/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<style>
@keyframes jihyuni {
0% {
left: 5%;
transform: rotate(0deg);
}
50% {
left: 75%;
transform: rotate(360deg);
}
100% {
left: 5%;
transform: rotate(0deg);
}
}
img {
position: relative;
margin-top: 50px;
animation: jihyuni 10s ease 1s infinite alternate-reverse;
}
</style>
</head>
<body>
<div id="disp"></div>
<script>
const disp = document.querySelector("#disp");
// 샘플 이미지 주소 내 맘은 카리나
const testURL = "https://media.nudge-community.com/8227404";
function downBlob(blob, filename) {
console.log(`체킁 ${filename}`, blob);
let aTag = document.createElement("a");
aTag.href = URL.createObjectURL(blob);
aTag.download = filename;
aTag.click();
URL.revokeObjectURL(blob); // 권장 메모리에 남아있는 거 해제, 안 하는 사람 더 많음
}
// AXIOS
async function axiosFileDownload(url) {
const resp = await axios.get(url, { responseType: "blob" });
downBlob(resp.data, "axios.gif");
}
axiosFileDownload(testURL);
//FETCH
async function fetchFileDownload(url) {
const resp = await fetch(url);
downBlob(await resp.blob(), "fetch.gif");
}
fetchFileDownload(testURL);
// JQUERY AJAX
$.ajax({
url: testURL,
xhrFields: {
responseType: "blob",
},
success: (rslt) => {
downBlob(rslt, "jquery.gif");
},
});
// Vanilla JS
function vanillaAjax() {
const xhr = new XMLHttpRequest();
xhr.open("get", testURL, true);
xhr.responseType = "blob";
xhr.onload = (rslt) => {
downBlob(xhr.response, "vanilla");
};
xhr.send();
}
vanillaAjax();
// 이건 덤으로 다운받은 파일 화면에 넣깅
// 이거까정 알아두깅!
async function axiosDum(url) {
const resp = await axios.get(url, { responseType: "blob" });
const domUrlString = URL.createObjectURL(resp.data);
const imgTag = document.createElement("img");
imgTag.src = domUrlString;
imgTag.width = 300;
imgTag.height = 300;
imgTag.style.borderRadius = "50%";
const aTag = document.createElement("a");
aTag.href = domUrlString;
aTag.download = "메롱.gif";
aTag.appendChild(imgTag);
disp.appendChild(aTag);
}
axiosDum(testURL);
</script>
</body>
</html>

 

결과는 뻔하디 뻔하게 아래와 같당. 

 

누차  누차  누렇게 곰팡이 필 정도로 반복 이야기 하는 거지만

현실에선 비동기가 아닌 걸 찾기가 더 힘들당. 인생은 비동기당.

그런데 비동기 개념이 어렵당?

 

결론은 이렇당... 당신이 너무 개인적인 건 아닐깡?

async / await 를 잘 쓰는 사람과 어서 결혼하장.

동시에 진행 되어야 할 일이 산 위에 산더미 위에 산더미당

 


 

사실 내 머리칼은 오래전 부터 하얗다.

염색으로 거짓 머리칼을 세상에 날렸다.

 

겉은 검지만, 살짝만 들어도 뿌리 근처는

모두 크리스마스 눈처럼 새하얗다.

 

나조차 머리칼이 희다는 사실을 때때로 잊는다.

큰 착각을 작은 행복으로 눈 가리고 아웅이당.

 

난 벌써 이미 꽤나 늙었는데, 색칠 좀 했다고

허리가 펴지고, 무릎이 스프링이 되지는 않는데

 

염색을 더 철저히 해야겠다.

뿌리까지 까매지도록.......

 

어디선가 지겹단 향기를 가득 머금은 목소리가 들린다.

그냥 마음대로 하세용~~ 

 

 

https://www.youtube.com/watch?v=z-xfGoabp

관련글 더보기