react에서 이미지를 업로드 및 이미지 미리보기 기능 구현에 대해 알아보자.
React와 Firebase를 연결해 storage를 사용할 수 있도록 구현하고 Firebase의 자세한 연동방법은 이번글에서는 생략하고 알아보도록 하자
useUploadImage.ts
import { getDownloadURL, ref, uploadBytes } from "firebase/storage";
import { v4 as uuidv4 } from "uuid";
import { storage } from "@/libs/firebase";
export default function useUploadImage() {
const storageRef = ref(storage, `files/${uuidv4()}`);
// firebase storage에 files이란 폴더가 만들어지고 그 안에 생성된 uuid 이름으로 이미지파일이 저장되게끔 한다.
const uploadImage = async (file: File) => {
const snapshot = await uploadBytes(storageRef, file);
const downloadUrl = await getDownloadURL(snapshot.ref);
return downloadUrl;
};
return uploadImage;
}
Page.tsx
import { useState } from "react";
import useUploadImage from "@/hooks/useUploadImage";
export default function Page() {
const [imageUrl, setImageUrl] = useState<string>("");
const [file, setFile] = useState<File | null>(null);
const uploadImage = useUploadImage();
const onSubmit = async (e: React.ChangeEvent<HTMLFormElement>) => {
e.preventDefault();
if (file) {
const downloadUrl = await uploadImage(file);
console.log(downloadUrl);
setImageUrl(downloadUrl);
}
};
const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const files = e.target.files;
if (!files) return null;
setFile(files[0]);
};
return (
<div>
<form onSubmit={onSubmit}>
<input type="file" onChange={onChange} accept="image/*" />
<button type="submit">이미지 업로드</button>
</form>
{imageUrl ? (
<img src={imageUrl} alt="previewImage" />
) : (
"이미지를 업로드 해주세요"
)}
</div>
);
}

