Imgur API로 이미지 업로드하기
개발 •

시작하기 전에
Imgur에서 앱을 추가하시고 클라이언트 ID를 발급받으셔야 합니다.
회원가입을 진행하셨으면 클라이언트 추가 페이지로 가주세요.

Authorization callback URL은 API 키를 발급받을 때 쓰는 주소입니다.
그냥 운영하시는 웹사이트의 주소를 써넣으시면 됩니다만, 그냥 네이버 주소 같은 것 치셔도 작동은 합니다.

성공적으로 클라이언트 추가를 마치시면 위 페이지가 나옵니다.
Client ID: 아래에 적힌 문자열을 복사해둬 주세요.
혹시 Client ID를 잊으시거나 클라이언트 설정을 변경하시려면 Applications 설정 페이지로 가시면 됩니다.
파일 업로드
<input type="file" name="image" id="upload">
일단 input 엘리먼트를 하나 생성해주세요.
앞으로 이 input의 변화를 감지해 파일을 업로드할 겁니다.
function uploadFile() {
const fileInput = document.getElementById("upload");
const upload = (file) => {
if (file && file.size < 5000000) {
const formData = new FormData();
formData.append("image", file);
fetch("https://api.imgur.com/3/image", {
method: "POST",
headers: {
Authorization: "Client-ID <클라이언트 ID>",
Accept: "application/json",
},
body: formData,
})
.then((response) => response.json())
.then((response) => {
console.log(response);
// do Something
});
} else {
console.error("파일 용량 초과");
}
};
fileInput &&
fileInput.addEventListener("change", () => {
upload(fileInput.files[0]);
});
}
uploadFile();
<클라이언트 ID>
를 본인의 클라이언트 ID로 변경해주세요.
이제 이미지를 선택해 Input의 파일이 변경될 때마다 Imgur에 업로드합니다.
console.log(response)
는 응답이 어떤 형태로 오는지 참고하시라고 추가해뒀으니, 해당 코드와 아래 줄의 do Something을 수정하시면 됩니다.
{
"data": {
"id": "vZhkDah",
"title": null,
"description": null,
"datetime": 1597929085,
"type": "image/jpeg",
"animated": false,
"width": 256,
"height": 256,
"size": 18088,
"views": 0,
"bandwidth": 0,
"vote": null,
"favorite": false,
"nsfw": null,
"section": null,
"account_url": null,
"account_id": 0,
"is_ad": false,
"in_most_viral": false,
"has_sound": false,
"tags": [],
"ad_type": 0,
"ad_url": "",
"edited": "0",
"in_gallery": false,
"deletehash": "u92F6eMKNenMMKg",
"name": "",
"link": "https://i.imgur.com/vZhkDah.jpg"
},
"success": true,
"status": 200
}
응답 예시입니다.
각종 이벤트 추가
매번 Input을 클릭해 파일을 추가하는 건 번거로우니, 드래그 & 드랍이나 클립보드 복사 등의 이벤트를 추가해주시면 훨씬 편하게 이미지 업로드가 가능합니다.
아래에선 예시로 textarea를 하나 추가하고, 그 textarea에 각종 이벤트를 추가해서, 업로드가 성공적으로 완료되면 textarea에 이미지 링크를 추가하는 기능을 구현해보겠습니다.
<textarea name="textarea" id="myTextarea" cols="30" rows="10"></textarea>
<label for="upload">업로드</label>
<input type="file" id="upload" hidden/>
html 구조입니다.
저는 개인적으로 input은 예쁘게 꾸미기 힘들어서 숨겨버리고 label을 꾸미는 방법을 선호합니다.
function uploadFile() {
const textarea = document.getElementById("myTextarea");
const fileInput = document.getElementById("upload");
const upload = (file) => {
if (file && file.size < 5e6) {
const formData = new FormData();
formData.append("image", file);
fetch("https://api.imgur.com/3/image", {
method: "POST",
headers: {
Authorization: "Client-ID <클라이언트 ID>",
Accept: "application/json",
},
body: formData,
})
.then((response) => response.json())
.then((response) => {
if (response.success) {
const { data } = response;
textarea.value += `${textarea.value ? "\n" : ""}${
data.animated && data.mp4 ? data.mp4 : data.link
}`;
} else {
console.error("업로드 실패");
}
})
.catch((error) => {
console.error(error);
});
} else {
console.error("파일 용량 초과");
}
};
const handleDrop = (event) => {
event.preventDefault();
const { files } = event.dataTransfer;
if (files.length) {
upload(files[0]);
}
};
const handlePaste = (event) => {
event.preventDefault();
const { files } = event.clipboardData;
if (files.length) {
upload(files[0]);
}
};
const preventDefault = (event) => {
event.preventDefault();
};
if (fileInput) {
fileInput.addEventListener("change", () => {
upload(fileInput.files[0]);
});
}
if (textarea) {
textarea.addEventListener("dragenter", preventDefault);
textarea.addEventListener("dragleave", preventDefault);
textarea.addEventListener("dragover", preventDefault);
textarea.addEventListener("drop", handleDrop);
textarea.addEventListener("paste", handlePaste);
}
}
uploadFile();
gif 이미지를 업로드하면 자동으로 mp4로 변환해주니, 움짤을 업로드하면 비디오 링크를 첨부하도록 해뒀습니다.
성공적으로 Imgur에 이미지 업로드를 마쳤습니다!
5MB가 넘는 파일은 첨부가 안 되고, Imgur 자체가 느리단 단점은 있지만, 간단한 서비스엔 요긴하게 써먹을 데가 많습니다.