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;