React로 이미지 업로드 기능을 구현하는데 발생했던 버그들로 고생을 했다..
정리하고 기록해서 나중에는 벌레 잡는데 걸리는 시간을 줄이자 😅
화면에 업로드한 이미지 보여주기
이미지 업로드 하기
이미지 파일 업로드 하기
// 부모 컴포넌트에게 선택된 files를 전달
const { setPostObject } = useContext(postSalesItemContext);
// 선택된 files를 화면에 보여주기 위한 배열
const [uploadedImages, setUploadedImages] = useState<UploadedImageType[]>([]);
// 중략
// 업로드 할 file 선택 이벤트
const handleUploadIconClick = () => {
fileInputRef.current?.click();
};
<S.UploadIcon onClick={handleUploadIconClick}>
<Icon name="camera" />
<span>
{uploadedCount} / {maxImageCount}
</span>
<S.UploadInput
type="file"
accept="image/*" // 모든 이미지 파일 허용
onChange={handleUploadImage} // 이미지 업로드 이벤트
ref={fileInputRef} // input 기능 끌어오기
/>
</S.UploadIcon>
const file = event.target.files?.[0];
console.log(event.target.files);
console.log(file);
const imageUrl = URL.createObjectURL(file);
const newUploadedImage: UploadedImageType = {
id: Date.now().toString(),
imageUrl,
};
setUploadedImages((prevImages) => [...prevImages, newUploadedImage]);
const handleUploadImage = (event: ChangeEvent<HTMLInputElement>) => {
const file = event.target.files?.[0];
const formData = new FormData();
formData.append('productImageUrls', file);
setPostObject((prevPostObject: PostObjectType) => ({
...prevPostObject,
files: [...(prevPostObject.files || []), formData],
}));
}
};
파일을 올리고 지우고 다시 올리면 기능이 먹통이 되는 문제가 발생했다.
const handleUploadImage = (event: ChangeEvent<HTMLInputElement>) => {
const file = event.target.files?.[0];
if (file) {
const imageUrl = URL.createObjectURL(file);
const newUploadedImage: UploadedImageType = {
id: Date.now().toString(),
imageUrl,
};
setUploadedImages((prevImages) => [...prevImages, newUploadedImage]);
setUploadedCount((prevCount) => prevCount + 1);
const formData = new FormData();
formData.append('productImageUrls', file);
setPostObject((prevPostObject: PostObjectType) => ({
...prevPostObject,
files: [...(prevPostObject.files || []), formData],
}));
}
event.target.value = '';
};
const handleUploadImage = (event: ChangeEvent<HTMLInputElement>) => {
const file = event.target.files?.[0];
if (file) {
const imageUrl = URL.createObjectURL(file);
const isDuplicate = uploadedImages.some(
(image) =>
image.file.name === file.name && image.file.size === file.size,
);
if (isDuplicate) {
event.target.value = '';
return;
}
const newUploadedImage: UploadedImageType = {
id: Date.now().toString(),
imageUrl,
file,
};
setUploadedImages((prevImages) => [...prevImages, newUploadedImage]);
setUploadedCount((prevCount) => prevCount + 1);
const formData = new FormData();
formData.append('productImageUrls', file);
setPostObject((prevPostObject: PostObjectType) => ({
...prevPostObject,
files: [...(prevPostObject.files || []), formData],
}));
}
event.target.value = '';
};