

next-cloudinary 패키지를 설치한다.npm install next-cloudinary


.env
NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME="<Your Cloud Name>"

CldUploadWidget를 추가한다.app/upload/page.tsx
import { CldUploadWidget } from "next-cloudinary";
const UploadPage = () => {
return (
<CldUploadWidget uploadPreset="<YOUR UPLOAD PRESET>">
</CldUploadWidget>
);
};
export default UploadPage;
CldUploadWidget 컴포넌트를 사용하기 위해서는 uploadPreset 속성을 설정하여야 한다.uploadPreset는 업로드에 적용할 설정들을 미리 정의할 수 있는 속성이다.settings 에 들어간다.
Upload 섹션에서 Add upload preset 버튼을 클릭한다.
Unsigned Preset 을 지정하고 이름을 복사한다.Unsigned Preset 은 사용자 인증 없이 파일을 업로드할 수 있도록 허용한다는 의미이다.Signed Preset 이 권장되지만, 테스트 목적으로 Unsigned Preset 을 사용하겠다.
app/upload/page.tsx
"use client";
import { CldUploadWidget } from "next-cloudinary";
const UploadPage = () => {
return (
<CldUploadWidget uploadPreset="jjyzftfd">
{({ open }) => (
<button className="btn btn-primary" onClick={() => open()}>
Upload an Image
</button>
)}
</CldUploadWidget>
);
};
export default UploadPage;
use client 지시문을 추가하여야 한다.



onUpload 함수는 이 이벤트를 수신할 수 있으며, result 와 widget 두 개의 인자를 받는다.onUpload 함수를 추가하고 이미지가 업로드되면 콘솔에 결과를 출력하도록 해보자.app/upload/page.tsx
"use client";
import { CldUploadWidget } from "next-cloudinary";
const UploadPage = () => {
return (
<CldUploadWidget
uploadPreset="jjyzftfd"
onUpload={(result, widget) => {
console.log(result);
}}
>
{({ open }) => (
<button className="btn btn-primary" onClick={() => open()}>
Upload an Image
</button>
)}
</CldUploadWidget>
);
};
export default UploadPage;
Result 객체에는 Event와 Info 두 속성이 포함되어 있다.Event는 업로드 성공을 나타내며, Info에는 이미지 크기, 생성날짜, 형식, 높이, 너비, 원본파일 이름, 사진을 고유하게 식별할 때 사용하는 Public ID 등의 정보가 담겨있다.Public ID 속성을 통해 Cloudinary 이미지 컴포넌트에서 이미지를 렌더링 할 수 있다.
PublicId를 저장할 상태변수를 선언하고, 이미지 업로드에 성공하면 PublicId 를 저장한다.PublicId를 저장하기 위한 인터페이스 정의도 필요하다.CldImage 컴포넌트에 저장한 PublicId 를 전달하여 이미지를 렌더링 한다.app/upload/page.tsx
"use client";
import { CldUploadWidget } from "next-cloudinary";
import { CldImage } from "next-cloudinary";
import { useState } from "react";
interface CloudinaryResult {
public_id: string;
}
const UploadPage = () => {
const [publicId, setPublicId] = useState("");
return (
<div>
{publicId && (
<CldImage
src={publicId}
width={270}
height={180}
alt="Uploaded Image Not Found"
/>
)}
<CldUploadWidget
uploadPreset="jjyzftfd"
onUpload={(result, widget) => {
if (result.event !== "success") return;
const info = result.info as CloudinaryResult;
setPublicId(info.public_id);
}}
>
{({ open }) => (
<button className="btn btn-primary" onClick={() => open()}>
Upload an Image
</button>
)}
</CldUploadWidget>
</div>
);
};
export default UploadPage;


