플러터에서 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('성공');
    }
  }
}

화이팅

0개의 댓글