개발일기
cloudinary에서 CldUploadWidget 없이 이미지 저장하기 본문
개요
supabase의 storage대신 cloudinary라는 라이브러리를 사용하기로 했다. 이유는 무료이기 때문이다. cloudinary에서 제공되는 CldUploadWidget으로 사진, 동영상 등을 쉽게 업로드 할 수 있지만, 만들고 있는 사이트에는 어울리는 것 같지 않아서 기본 업로드 방식을 사용하되 cloundinary에 이미지만 저장 하기로 했다. supabase를 사용하지 않으니까 생각보다 빈자리가 컸다. 한번 사용 해보자.
설치
npm install next-cloudinary
env 설정하기
cloundinary를 사용하기 위해선 먼저 Cloud name이 필요하고, CldUploadWidget Upload Preset이 필요하다.
먼저 cloudinary Docs에서는 이렇게 설명되어 있다.

그러면 Cloud Name과 Upload Preset은 어디에 있는 걸까?
cloud name
cloudinary 로그인시 좌측 상단에서 바로 확인이 가능하다.
우리는 .env파일에 아래의 cloud Name을 사용해 주면 된다.

upload preset
CldUploadWidget 위젯을 사용하기 위해선 아래 코드와 같이 upload preset이라는 값이 필요한데
이것 또한 우리는 환경변수에 넣어줄거다.
import { CldUploadWidget } from 'next-cloudinary';
<CldUploadWidget uploadPreset="<Your Upload Preset>">
{({ open }) => {
return (
<button onClick={() => open()}>
Upload an Image
</button>
);
}}
</CldUploadWidget>
1. 왼쪽 하단 설정 클릭

2.설정 클릭시 나오는 아래 화면에서 Upload 클릭

3. Add Upload Preset 클릭

4. Upload Preset 생성
아래에서 작성한 Upload Preset name이 Upload Preset이 되며
브라우저에서 업로드 하려면 signing mode를 Unsigned로 변경 해줘야 한다.

CldUploadWidget 없이 이미지 저장 하기
위의 방법을 다 했다면 우리는 CldUploadWidget을 사용하여 업로드 할 수 있다. 아래의 코드와 함께.
import { CldUploadWidget } from 'next-cloudinary';
<CldUploadWidget uploadPreset="<Your Upload Preset>">
{({ open }) => {
return (
<button onClick={() => open()}>
Upload an Image
</button>
);
}}
</CldUploadWidget>

하지만 위와 같이 업로드 UI가 사이트와 어울리지 않는다면 기본 업로드 UI를 사용해서 업로드 해야한다.
방법을 확인해 보자.
1. formData 생성하기
export const uploadImage = async (image: File) => {
// 업로드 할 url 설정
const url = `https://api.cloudinary.com/v1_1/${process.env.NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME}/upload`;
// formData 생성
const formData = new FormData();
// file이라는 키에 image(사용자가 업로드할 이미지) 데이터 추가
formData.append("file", image);
// upload_preset에 환경변수 upload_Rreset 추가
formData.append(
"upload_preset",
process.env.NEXT_PUBLIC_CLOUDINARY_UPLOAD_PRESET!
);
// formData를 body에 담아서 POST 요청을 보냄(cloudinary에 업로드)
const response = await fetch(url, {
method: "POST",
body: formData,
});
const data = await response.json();
return data.url; // 업로드된 이미지 url 반환
};
2. cloudinary에 업로드된 이미지 데이터베이스에 업로드 하기
const profileUpdateHandle = async (e: React.FormEvent) => {
e.preventDefault();
const imageUrl = uploadImageFile ? await uploadImage(uploadImageFile as File) : null;
const updateProfileData = {
id: id,
image: imageUrl,
name: name,
};
//...upload code
};
마무리
supabase의 storage를 사용했을 때는 중복되는 이미지 이름이 생기지 않도록 따로 랜덤 이름을 생성해서 업로드 해줘야 했지만, cloudinary는 알아서 랜덤 이름이 적용되서 편했다. 백엔드 서비스(?)를 바꾸면서 해야할 것들이 많아 졌다. 공부와 프로젝트,, 부지런히 해야겠다.
'SideProject(My-Selectshop-Finder)' 카테고리의 다른 글
NextAuth 로그인 실패시 에러 처리하기 (0) | 2025.03.12 |
---|---|
NextAuth 사용자 정보 update 및 mutate 하기 (0) | 2025.02.03 |
카카오 지도 API에서 pagination과 필터링: 데이터 정렬 문제 해결하기 (0) | 2024.12.24 |
카카오 지도 api에서 pagination을 통한 45개 데이터 가져오기 (1) | 2024.12.24 |
supabase "Could not find the ' ' column of ' ' in the schema cache" 에러 해결 (0) | 2024.12.02 |