firebase
[firebase] Storage 스토리지 버킷 파일 수정 방법
코복이
2023. 7. 18. 10:43
728x90
개삽질의 결과물을 기록해본다.
결론만 말하면, 기존 파일을 지우고 새로 올리면 된다.
의도
내가 작성한 글에서 이미지를 수정하면 Firestore에 저장한 이미지 URL은 물론이고 Storage 의 이미지 원본도 변경
FireStore
Storage Bucket
이전 코드
1) fileRef에서 기존 파일의 ref를 가져오는게 쉽지 않았다.
2) 결국 이전 파일의 url을 넣으면 위치가 잡히는 걸 알았음.
*firestore는 콜렉션->문서 단위로 접근해야하는데 storage는 바로 파일 주소 떄려박으니까 됨
3) 그러나 오류 : root 파일을 직접 변경할 수 없다 (child를 만들어라!)
* 나는 직접 바꾸고 싶은데??
/* 피드 수정 */
export const updateFeed = async (feed, editRef, feedList, newFileUrl) => {
/* Storage 업데이트 */
const fileRef = ref(storage, `기존 파일 Url`);
const response = await uploadString(fileRef, newFileUrl, "data_url");
const newImgUrl = await getDownloadURL(response.ref);
console.log(newImgUrl);
/* Firestore 업데이트 */
const feedRef = doc(db, "feeds", `${feed.id}`);
await updateDoc(feedRef, {
createdAt: Timestamp.now(),
feedText: editRef.current.value,
imgUrl: newImgUrl,
});
const feedIndex = feedList.findIndex((item) => item.id === feed.id);
const updatedFeed = {
...feedList[feedIndex],
createdAt: Timestamp.now(),
feedText: editRef.current.value,
imgUrl: newImgUrl,
};
const prevList = feedList.slice(0, feedIndex);
const nextList = feedList.slice(feedIndex + 1);
const newList = [...prevList, updatedFeed, ...nextList];
return newList;
};
수정 코드
1) 게시판을 생각했다. 내가 게시판에서 새로운 이미지로 바꾸고 싶으면 어떻게 했지?
*기존 것을 '지우고' 새로운 이미지를 올렸다.
2) 아 기존것 지우고 새로 올리면 되는데 왜 그 위치 그대로에서 파일만 바꾸고 싶었을까?
3) 우여곡절 끝에 의도대로 작동을 한다.
/* 피드 수정 */
export const updateFeed = async (feed, editRef, feedList, newFileUrl) => {
/* Storage 업데이트 */
/* 이전꺼 삭제하고 */
await deleteObject(ref(storage, feed.imgUrl));
/* 새로 등록함 */
const fileRef = ref(storage, `${feed.creatorId}/${uuidv4()}`);
const response = await uploadString(fileRef, newFileUrl, "data_url");
const newImgUrl = await getDownloadURL(response.ref);
console.log(newImgUrl);
/* Firestore 업데이트 */
const feedRef = doc(db, "feeds", `${feed.id}`);
await updateDoc(feedRef, {
createdAt: Timestamp.now(),
feedText: editRef.current.value,
imgUrl: newImgUrl,
});
const feedIndex = feedList.findIndex((item) => item.id === feed.id);
const updatedFeed = {
...feedList[feedIndex],
createdAt: Timestamp.now(),
feedText: editRef.current.value,
imgUrl: newImgUrl,
};
const prevList = feedList.slice(0, feedIndex);
const nextList = feedList.slice(feedIndex + 1);
const newList = [...prevList, updatedFeed, ...nextList];
return newList;
};
완료
728x90