플러터에서 Cloud Storage의 파일을 ref를 참조해서 지우면 된다.
그런데 아래처럼 Storage에 폴더를 생성했을 때 (찾다보니 Storage는 실제로는 폴더 개념이 아니라는 것 같기도 하고)
firebase_storage.Reference imageReference = firebase_storage
.FirebaseStorage.instance
.ref('ChatImages')
.child('$chatID')
.child(filetime);
나중에 채팅방을 삭제하거나 회원이 탈퇴할 경우 폴더째 삭제하는 메소드가 제공 안되고 있다. ref().delete() 만 나옴
이 경우
https://stackoverflow.com/questions/72332787/how-to-delete-a-firebase-storage-folder-from-a-firebase-cloud-function
위 글을 참조하여 functions 코드를 짰는데 작동하길래 올려본다.
flutter말고는 아무것도 모르다보니
혼자 짜려고 했으면 절대 못했을텐데,
귀인이 도와주신 코드는 사실 허무할정도로 간단하긴 하다.
코드에 등장하는 deleteFiles란 메소드를 어디에서 찾아볼 수 있는지도 모르는 수준이라.. 나름 힘들었다ㅠㅠㅠ 펑션은 언제나 두려움부터 다가오는것..
나처럼 비전공 독학 플린이에게 도움되시길 바람
Storage 구조는
-ChatImages
ㄴChatID1
ㄴChatID2
.... 와 같이 저장되는 걸 가정함
deleteChatImages.js
const functions = require("firebase-functions");
const admin = require('firebase-admin');
const db = admin.storage();
exports.deleteChatImages =
functions.region("asia-northeast3").https.onCall(async (data, context) => {
const dataPath = data.dataPath;
const bucket = db.bucket();
if (dataPath != '' && dataPath != null) // 자칫 잘못하면 모든 유저의 해당 카테고리 이미지를 다 삭제할 수도 있어서 상위 폴더도 아래 ChatImages와 같이 미리 지정해두었고 혹시 입력된 경로가 없을 경우 if문으로 걸리게 해두었다.
{
try{
functions.logger.log('============= 채팅 이미지 삭제 시작 =============');
async function deleteFolder(){
await bucket.deleteFiles({prefix: `ChatImages/${dataPath}` //ex.'images/users/${uid}'
}).then(val => {
functions.logger.log('채팅파일 삭제 성공');
return {
msg: "success"
};
}).catch(err => {
functions.logger.error('then 에러');
return {
msg: "fail"
};
});}
deleteFolder();
}
catch(e) {
functions.logger.error('try catch 에러');
return {
msg: "error"
};
};}
});
아래는 deleteChatImages를 호출하는 flutter 함수
deleteChatImagesFolder(String chatID) async {
HttpsCallable callable =
FirebaseFunctions.instanceFor(region: 'asia-northeast3')
.httpsCallable('deleteChatImages');
if (chatID != '') {
final resp = await callable.call({'dataPath': 'ChatImages/$chatID'});
if (resp.data['msg'] == "fail") {
print('then 에러');
}
if (resp.data['msg'] == "error") {
print('try 에러');
}
if (resp.data['msg'] == "success") {
print('성공');
}
}
}
화이팅