
✅ 추천 기준에 따른 선택 가이드
✅ 간단한 이미지 링크 공유 및 웹사이트 통합
추천 서비스: ImgBB, Postimg.cc, Catbox.moe
특징: 계정 없이 빠른 업로드 및 링크 제공, 간단한 웹사이트 통합 가능
✅ 이미지 최적화 및 변환 기능 필요
추천 서비스: Cloudinary
특징: 이미지 최적화, 다양한 변환 기능, CDN 지원, API 제공
✅ 광고 없이 깔끔한 사용자 경험
추천 서비스: ImageShack (Pro), ImgBB Pro, Imgur Pro
특징: 광고 제거, 고용량 업로드 지원, 추가 기능 제공
✅ 익명 업로드 및 단기 호스팅
추천 서비스: Uguu.se, AnonFiles
특징: 익명 업로드, 단기간 호스팅, 만료 후 자동 삭제
⚠️ 참고 사항
ImgBB의 저장 용량 제한: 공식 문서에는 명시되어 있지 않지만, 일부 리뷰에서는 "무제한 저장 공간"으로 언급되고 있습니다. 그러나 이는 공식적으로 보장된 사항이 아니므로, 대규모 이미지 저장 시 서비스 정책을 확인하는 것이 좋습니다.
Cloudinary의 무료 요금제: 25GB의 저장 용량과 트래픽을 제공하며, 이미지 최적화 및 변환 기능을 지원합니다. 그러나 월별 크레딧 한도가 있으므로 사용량에 따라 요금이 부과될 수 있습니다.
API 사용 시 주의사항: 대부분의 서비스는 API를 통해 이미지 업로드 및 관리를 지원합니다. 그러나 API 호출 횟수나 사용량에 제한이 있을 수 있으므로, 사용 전에 해당 서비스의 API 문서를 참고하는 것이 좋습니다.
방법1)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<title>:: AJAX 파일전송 ::</title>
<script src="http://code.jquery.com/jquery-1.12.4.js"></script>
<!-- <script async src="https://imgbb.com/upload.js"></script> -->
<script type="text/javascript">
function ajaxFileUpload() {
var form = jQuery("ajaxFrom")[0];
var formData = new FormData(form);
formData.append("message", "ajax로 파일 전송하기");
var fileValue = $("#ajaxFile").val().split("\\");
var fileName = fileValue[fileValue.length-1].replace(/(.png|.jpg|.jpeg|.gif)$/, ''); // 파일명
console.log("fileName : "+fileName);
console.log("fd");
/* $.get('http://127.0.0.1/aj/imgbb/key', function(data, status){
if(status=="success"){
}
console.log(data);
console.log(status);
});
return;
*/
// var urlImg="http://localhost:8080/imgbb/imgs/life.jpg";
formData.append("key", "키값");
formData.append("image", jQuery("#ajaxFile")[0].files[0]);
formData.append("name", fileName);
//formData.append("expiration", "");
console.log("파일 데이터");
console.dir(jQuery("#ajaxFile")[0].files[0]);
console.log("-------------");
console.log(jQuery("#ajaxFile")[0].files[0]);
//return;
jQuery.ajax({
url : "https://api.imgbb.com/1/upload"
, type : "POST"
, processData : false
,contentType : false
, data : formData
, success:function(imgbbReturn) {
if(imgbbReturn.success==true){
console.dir(imgbbReturn);
var imgbb = imgbbReturn.data;
console.log(imgbb.delete_url);
console.log(imgbb.display_url);
console.log(imgbb.expiration);
console.log(imgbb.id);
console.log("imgbb.image.url : " +imgbb.image.url);
//image: {filename: "summerfield-336672-640-jpg.jpg", name: "summerfield-336672-640-jpg", mime: "image/jpeg", extension: "jpg", url: "https://i.ibb.co/KXfCM3m/summerfield-336672-640-jpg.jpg"}
console.log(imgbb.size);
//thumb: {filename: "summerfield-336672-640-jpg.jpg", name: "summerfield-336672-640-jpg", mime: "image/jpeg", extension: "jpg", url: "https://i.ibb.co/yXZLwbV/summerfield-336672-640-jpg.jpg"}
console.log("imgbb.thumb.url : " +imgbb.thumb.url);
console.log(imgbb.time);
console.log(imgbb.title);
console.log(imgbb.url);
console.log(imgbb.url_viewer);
console.log("반환값");
//console.dir(json);
//var obj = JSON.parse(json);
}
}
});
}
</script>
</head>
<body>
<form enctype="multipart/form-data" id="ajaxFrom" method="post">
<input type="file" id="ajaxFile"/>
<input type="button" onClick="ajaxFileUpload();" value="업로드"/>
</form>
</body>
</html>
<!-- <a href="http://localhost/ajSecurity/imgbb/key" >http://localhost/ajSecurity/imgbb/key</a>
<br></br>
<a href="http://localhost/aj/imgbb/key" >http://localhost/aj/imgbb/key</a>
-->
방법2)
async function uploadImageToImgbb(imageFile, apiKey, albumId) {
const formData = new FormData();
formData.append('image', imageFile);
formData.append('key', apiKey);
try {
const response = await fetch('https://api.imgbb.com/1/upload', {
method: 'POST',
body: formData
});
const result = await response.json();
if (result.success) {
console.log('Image URL:', result.data.url);
if (albumId) {
// Album 관련 처리를 여기서 수행
console.log(`Image added to album: ${albumId}`);
}
} else {
console.error('Error uploading image:', result.error.message);
}
} catch (error) {
console.error('Error uploading image:', error);
}
}
// 사용 예제
const imageFile = document.querySelector('input[type="file"]').files[0];
const apiKey = 'your_imgbb_api_key_here';
const albumId = 'aaa'; // 이 부분은 imgbb API의 앨범 기능 지원 여부에 따라 처리
uploadImageToImgbb(imageFile, apiKey, albumId);
리액트 처리
export async function imgbbUpload(imageData:File, fileName:string) {
if (!process.env.NEXT_IMGBB_API_KEY) {
throw new Error("NEXT_IMGBB_API_KEY environment variable is not set");
}
const formData = new FormData();
formData.append("image", imageData);
formData.append("key", process.env.NEXT_IMGBB_API_KEY);
formData.append("name", fileName);
const response=await fetch("https://api.imgbb.com/1/upload", {
method: "POST",
body: formData,
});
if(!response.ok){
console.error("Upload failed");
throw new Error("Upload failed");
}
const res = await response.json();
console.log("img bb 반환값 url : ",res);
const imgBB={
id:res.data.id,
title:res.data.title,
url:res.data.url,
thumb_url:res.data.thumb.url,
medium_url:res.data.medium.url,
delete_url:res.data.delete_url
}
return imgBB;
}
✅ 반드시 저장해야 하는 데이터
- id: "bg80BvT0" (Ibb의 이미지 ID, URL 생성에 필요)
- title: "profile-1741010302380-de4a7b68-60ce-4c0b-9f5e-4fa19343be83" (사용자가 올린 파일명)
✅ 필요하면 저장하는 데이터
- url: "https://i.ibb.co/Kj3PqsdP/profile-1741010302380-de4a7b68-60ce-4c0b-9f5e-4fa19343be83.jpg" (원본 이미지)
- thumb.url: "https://i.ibb.co/bg80BvT0/profile-1741010302380-de4a7b68-60ce-4c0b-9f5e-4fa19343be83.jpg" (썸네일 URL)
- medium
- delete_url: 삭제 기능이 필요하면 저장
img bb 에서 반환 되는 값은 다음 데이터 값들을 저장 ID + URL을 저장하는 경우 (추천)
{
"id": "bg80BvT0",
"title": "profile-1741010302380-de4a7b68-60ce-4c0b-9f5e-4fa19343be83",
"url": "https://i.ibb.co/Kj3PqsdP/profile-1741010302380-de4a7b68-60ce-4c0b-9f5e-4fa19343be83.jpg",
"thumb_url": "https://i.ibb.co/bg80BvT0/profile-1741010302380-de4a7b68-60ce-4c0b-9f5e-4fa19343be83.jpg",
"medium_url": "https://i.ibb.co/bg80BvT0/profile-1741010302380-de4a7b68-60ce-4c0b-9f5e-4fa19343be83.jpg",
"delete_url": "https://ibb.co/bg80BvT0/6a600ffecfe822688654c2b536515a96"
}
function imageLoader(config) {
const urlStart=config.src.split('upload/')[0];
const urlEnd=config.src.split('upload/')[1];
const transformations=`w_200,q_${config.quality}`;
return `${urlStart}upload/${transformations}/${urlEnd}` ;
}
function Post({ post, action }) {
return (
<article className="post">
<div className="post-image">
<Image loader={imageLoader} src={post.image} alt={post.title} fill quality={50} />
{/* <CldImage
src={post.image} width="100" height="100" crop={{ type: 'auto', source: true }}
/> */}
css
.post-image{
position: relative;
width: 8rem;
height: 6rem;
object-fit: cover;
}
다음을 참조
https://macaronics.net/m04/react/view/2239
























댓글 ( 5)
댓글 남기기