2023년 8월 26일 토요일

[Unity] firebase storage에서 폴더째로 삭제하기(feat. google cloud functions)

 firebase unity sdk에서는 저장소의 listall같은 기능(하위경로 확인)이 존재하지 않는다.


그래서 goolge cloude function을 이용하여 구현하여야 한다.


## 공식 문서링크

https://cloud.google.com/functions/docs?hl=ko


요금은 대략

월 200만건 무료이고

100만건당 0.4달러


라고 보면된다 (CPU환경이나 메모리에따라 요금 상이함)


# 하는 방법

기존 firebase와 연결해 놓은 googlecloud 를 이용한다.


대시보드









---



Cloud Functions 클릭

---



함수 만들기 눌러서 
인증되지 않은 호출 허용 체크
리전 선택
ADD 트리거 클릭


---

트리거 Storage 선택

---

각종 설정 알잘딱 하시고


---











노드 코드 
진입점 똑같이 맞춰주시고


package.json 코드도 맞춰주기


---

node.js
```
const functions = require('@google-cloud/functions-framework');
const {Storage} = require('@google-cloud/storage');
const storage = new Storage();

// Register an HTTP callback with the Functions Framework.
functions.http('listFilesInFolder', async (req, res) => {
  const bucketName = req.query.bucket; // 버킷 이름
  const folderPath = req.query.folder; // 폴더 경로

  if (!bucketName || !folderPath) {
    res.status(400).send('Missing bucket or folder parameter');
    return;
  }

  try {
    const options = {
      prefix: folderPath,
    };

    const [files] = await storage.bucket(bucketName).getFiles(options);

    // 'files' is an array of File objects.
    res.send(files.map(file => file.name));
  } catch (err) {
    console.error('ERROR:', err);
    res.status(500).send(err);
  }
});
```

package.json

```
{
  "dependencies": {
    "@google-cloud/functions-framework": "^3.0.0",
     "@google-cloud/storage": "^7.0.1"
  }
}

```





유니티에서 제가 사용한 코드입니다

대략 이런식으로 사용하시면 됩니다
```
using Firebase.Storage;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Networking;

public class FirebaseStorageAllBucketList : MonoBehaviour
{


    public List<string> stringList;
    public int deleteCnt;

    public string folderPath;

    [System.Serializable]
    public static class JsonHelper
    {
        public static List<T> FromJson<T>(string json)
        {
            string newJson = "{ \"array\": " + json + "}";
            Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(json);
            return wrapper.Items;
        }
        private class Wrapper<T>
        {
            public List<T> Items;
        }
    }


    public void CallGetallBucket(string folderPath)
    {
        StartCoroutine(GetBucketList(folderPath));
    }


    IEnumerator GetBucketList(string folderPath )
    {

        string url = $"(함수 url 입력)?bucket=(사용자 버킷)&folder={folderPath}";

        using (UnityWebRequest www = UnityWebRequest.Get(url))
        {
       

            yield return www.SendWebRequest();

            if (www.result != UnityWebRequest.Result.Success)
            {
                Debug.Log(www.error);
            }
            else
            {
                Debug.Log(www.downloadHandler.text);
                string[] splitArray = www.downloadHandler.text.TrimStart('[').TrimEnd(']').Split(',');

                stringList = new List<string>();
               
                foreach (string item in splitArray)
                {
                    stringList.Add(item.Trim().Trim('\"'));
                }
                deleteCnt = stringList.Count;
            }
        }
    }
}


```


이상입니다!






댓글 없음:

댓글 쓰기

git rejected error(feat. cherry-pick)

 문제 아무 생각 없이 pull을 받지않고 로컬에서 작업! 커밋, 푸시 진행을 해버렷다. push에선 remote와 다르니 당연히 pull을 진행해라고 하지만 로컬에서 작업한 내용을 백업하지 않고 진행하기에는 부담스럽다(로컬작업 유실 가능성) 해결하려...