투케이2K

128. (TWOK/UTIL) [Ios/Swift] C_FirebaseStorageService : 파이어베이스 Storage 스토리지 관리 클래스 본문

투케이2K 유틸파일

128. (TWOK/UTIL) [Ios/Swift] C_FirebaseStorageService : 파이어베이스 Storage 스토리지 관리 클래스

투케이2K 2024. 5. 15. 11:10

[설 명]

프로그램 : Ios / Swift

설 명 : C_FirebaseStorageService : 파이어베이스 Storage 스토리지 관리 클래스

 

[소스 코드]

 

import Foundation
import UIKit
// ----------------------------------
// MARK: - [파이어베이스 라이브러리]
// ----------------------------------
import Firebase
import FirebaseStorage
// ----------------------------------

class C_FirebaseStorageService {



    /**
     * // -----------------------------------------------------------------------------------------------------------------------------------------------------------------
     * TODO [클래스 설명]
     * // -----------------------------------------------------------------------------------------------------------------------------------------------------------------
     * 1. 파이어베이스 Storage 스토리지 관리 클래스
     * // -----------------------------------------------------------------------------------------------------------------------------------------------------------------
     * 2. 참고 사이트 (기본 Storage 설명) : https://firebase.google.com/docs/storage?hl=ko&_gl=1*1ylydtb*_up*MQ..*_ga*MTk1MzY3OTg4OS4xNzA5NzkyODU1*_ga_CW55HF8NVT*MTcwOTc5Mjg1NS4xLjAuMTcwOTc5Mjg1NS4wLjAuMA..
     * // -----------------------------------------------------------------------------------------------------------------------------------------------------------------
     * 3.  참고 사이트 (Storage 비용 설명) : https://firebase.google.com/pricing?hl=ko
     * // -----------------------------------------------------------------------------------------------------------------------------------------------------------------
     * 4. 참고 사이트 (Storage 생성 방법) : https://blog.naver.com/kkh0977/223376155889
     * // -----------------------------------------------------------------------------------------------------------------------------------------------------------------
     * 5. TODO 서비스 적용 방법 :
     *
     *  - Ios 에서 사전 파일 저장소 읽기 및 쓰기 권한 필요
     *  - 파이어베이스 콘솔 프로젝트 생성
     *  - GoogleService-Info.plist 파일 프로젝트에 추가
     *  - 파이어베이스 의존성 추가 : SPM 및 코코아팟에서 Firebase Storage 추가
     * // -----------------------------------------------------------------------------------------------------------------------------------------------------------------
     * */





    /**
     * // -----------------------------------------------------------------------------------------------------------------------------------------------------------------
     * //  TODO [빠른 로직 찾기 : 주석 로직 찾기]
     * // -----------------------------------------------------------------------------------------------------------------------------------------------------------------
     * // [SEARCH FAST] : [Observable] : [Save File] : 특정 파일 Storage 에 저장
     * // -----------------------------------------------------------------------------------------------------------------------------------------------------------------
     * // [SEARCH FAST] : [Observable] : [Get File List] : Storage 에 저장 된 파일 리스트 확인
     * // -----------------------------------------------------------------------------------------------------------------------------------------------------------------
     * // [SEARCH FAST] : [Observable] : [File DownLoad Url] : 특정 파일 다운 로드 URL 확인
     * // -----------------------------------------------------------------------------------------------------------------------------------------------------------------
     *
     * // -----------------------------------------------------------------------------------------------------------------------------------------------------------------
     *
     * // -----------------------------------------------------------------------------------------------------------------------------------------------------------------
     * */
    
    
    
    
    
    // -----------------------------------------------------------------------------------------
    // MARK: - [전역 변수 선언]
    // -----------------------------------------------------------------------------------------
    private static let ACTIVITY_NAME = "C_FirebaseStorageService"





    // -----------------------------------------------------------------------------------------
    // MARK: - [SEARCH FAST] : [Observable] : [Save File] : 특정 파일 Storage 에 저장
    // -----------------------------------------------------------------------------------------
    func observableStorageSaveFile(filePath:URL, fileType:String, fileName:String, completion: @escaping (Bool)->()) {
        
        /*
        // -----------------------------------------
        [observableStorageSaveFile 메소드 설명]
        // -----------------------------------------
        1. 파이어베이스 스토리지에 특정 파일 저장 실시
        // -----------------------------------------
        2. 호출 방법 :
         
         // [앱 내부에 저장 된 파일 저장소 경로 지정]
         let filePath = "test"
         guard let filePath = Bundle.main.path(forResource: filePath, ofType: "txt")
         else {
             self.showAlert(
                 type: 0,
                 tittle: S_FinalData.AL_TITLE_ERRPR, content: "웹뷰 로드에 정의 되지 않은 타입 입니다 (html file path is nil)",
                 okBtb: S_FinalData.AL_OK, noBtn: "")
             return
         }
         let urlFile = URL(fileURLWithPath: filePath)
         
         // [파이어베이스 저장 경로 및 파일 명칭 지정]
         let fileType = "text/plain"
         let fileName = "LOG.txt"
         
         C_FirebaseStorageService().observableStorageSaveFile(filePath:urlFile, fileType:fileType, fileName:fileName){(result) in
             
             S_Log._F_(description: "파이어베이스 파일 저장 결과 확인", data: ["\(result)"])
             
         }
         
        // -----------------------------------------
        3. 파일 콘텐츠 타입 참고 :
         
         [오디오 타입]
         audio/mpeg
         audio/x-ms-wma
         
         [텍스트 타입]
         text/css
         text/html
         text/plain
         text/xml
         
         [이미지 타입]
         image/jpeg
         image/png
        // -----------------------------------------
        */
        
        // [메인 큐에서 비동기 방식 실행 : UI 동작 실시]
        DispatchQueue.main.async {
            S_Log._F_(description: C_FirebaseStorageService.ACTIVITY_NAME + " : [Firebase] [Storage] 파일 저장 수행", data: [
                "filePath :: \(filePath.absoluteString)",
                "fileType :: \(fileType)",
                "fileName :: \(fileName)"
            ])
            
            
            // [널 체크]
            if C_Util().stringNotNull(str: filePath.absoluteString) == true && C_Util().stringNotNull(str: fileType) == true && C_Util().stringNotNull(str: fileName) == true {
                
                // [Storage 인스턴스 지정]
                let storage = Storage.storage() //인스턴스 생성
                
                // [Storage 메타 데이터 선언]
                let metaData = StorageMetadata()
                
                // [데이터 타입 지정]
                metaData.contentType = "\(fileType)"
                
                // [Storage 에 파일 업로드]
                storage.reference().child("/" + fileName).putFile(from: filePath, metadata: metaData){
                    (metaData,error) in if let error = error { //실패
                        S_Log._F_(description: C_FirebaseStorageService.ACTIVITY_NAME + " : [Firebase] [Storage] [Error] - 파일 저장 에러", data: [
                            "ERROR :: \(error.localizedDescription)"
                        ])
                        
                        // [콜백 반환]
                        completion(false)
                        return
                    }else{ //성공
                        S_Log._F_(description: C_FirebaseStorageService.ACTIVITY_NAME + " : [Firebase] [Storage] [Success] - 파일 저장 성공", data: nil)
                        
                        // [콜백 반환]
                        completion(true)
                    }
                }
            }
            else {
                S_Log._F_(description: C_FirebaseStorageService.ACTIVITY_NAME + " : [Firebase] [Storage] [Error] - 파일 저장 에러", data: [
                    "ERROR :: Input Data Is Null"
                ])
                
                // [콜백 반환]
                completion(false)
            }
            
        }
    }
    
    
    
    
    
    // -----------------------------------------------------------------------------------------
    // MARK: - [SEARCH FAST] : [Observable] : [Get File List] : Storage 에 저장 된 파일 리스트 확인
    // -----------------------------------------------------------------------------------------
    func observableStorageGetFileList(filePath:String, completion: @escaping (Array<String>)->()) {
        
        /*
        // -----------------------------------------
        [observableStorageSaveFile 메소드 설명]
        // -----------------------------------------
        1. 파이어베이스 스토리지 파일 저장 목록 확인 실시
        // -----------------------------------------
        2. 호출 방법 :
         
         // [파이어베이스 저장 경로 지정]
         let filePath = "/"
         
         // [메소드 호출]
         C_FirebaseStorageService().observableStorageGetFileList(filePath:filePath){(result) in
             
             S_Log._F_(description: "파이어베이스 파일 목록 확인", data: ["\(result)"])
             
         }
         
        // -----------------------------------------
        */
        
        // [메인 큐에서 비동기 방식 실행 : UI 동작 실시]
        DispatchQueue.main.async {
            S_Log._F_(description: C_FirebaseStorageService.ACTIVITY_NAME + " : [Firebase] [Storage] 파일 저장 목록 확인 수행", data: [
                "filePath :: \(filePath)"
            ])
            
            
            // [리턴 변수 선언]
            var returnData : Array<String> = []
            
            
            // [널 체크]
            if C_Util().stringNotNull(str: filePath) == true {
                
                // [Storage 인스턴스 지정]
                let storage = Storage.storage() //인스턴스 생성
                
                // [Storage 에 파일 업로드]
                storage.reference().child(filePath).listAll { (result, error) in
                    if let error = error {
                        S_Log._F_(description: C_FirebaseStorageService.ACTIVITY_NAME + " : [Firebase] [Storage] [Error] - 파일 저장 목록 확인 에러", data: [
                            "ERROR :: \(error.localizedDescription)"
                        ])
                        
                        // [콜백 반환]
                        completion(returnData)
                        return
                    }
                    
                    // [result 널 체크]
                    if result != nil && result?.items.count ?? 0 > 0 {
                        
                        for item in result!.items {
                            
                            // [리턴 배열에 추가]
                            returnData.append(item.name)
                        }
                        
                        // [리턴 반환 수행]
                        S_Log._F_(description: C_FirebaseStorageService.ACTIVITY_NAME + " : [Firebase] [Storage] [Success] - 파일 저장 목록 확인 성공", data: [
                            "RETURN :: \(returnData)"
                        ])
                        
                        // [콜백 반환]
                        completion(returnData)
                    }
                    else {
                        S_Log._F_(description: C_FirebaseStorageService.ACTIVITY_NAME + " : [Firebase] [Storage] [Error] - 파일 저장 목록 확인 에러", data: [
                            "ERROR :: firebase save list is null"
                        ])
                        
                        // [콜백 반환]
                        completion(returnData)
                    }
                }
            }
            else {
                S_Log._F_(description: C_FirebaseStorageService.ACTIVITY_NAME + " : [Firebase] [Storage] [Error] - 파일 저장 목록 확인 에러", data: [
                    "ERROR :: Input Data Is Null"
                ])
                
                // [콜백 반환]
                completion(returnData)
            }
            
        }
    }
    
    
    
    
    
    
    // -----------------------------------------------------------------------------------------
    // MARK: - [SEARCH FAST] : [Observable] : [File DownLoad Url] : 특정 파일 다운 로드 URL 확인
    // -----------------------------------------------------------------------------------------
    func observableFileDownUrl(filePath:String, fileName:String, completion: @escaping (String)->()) {
        
        /*
        // -----------------------------------------
        [observableFileDownUrl 메소드 설명]
        // -----------------------------------------
        1. 파이어베이스 특정 파일 다운 로드 URL 확인
        // -----------------------------------------
        2. 호출 방법 :
         
         // [파이어베이스 저장 경로 지정]
         let filePath = "/"
         let fileName = "LOG.txt"
         
         // [메소드 호출]
         C_FirebaseStorageService().observableFileDownUrl(filePath:filePath, fileName:fileName){(result) in
             
             S_Log._F_(description: "파이어베이스 특정 파일 다운 로드 URL 확인", data: ["\(result)"])
             
         }
         
        // -----------------------------------------
        */
        
        // [메인 큐에서 비동기 방식 실행 : UI 동작 실시]
        DispatchQueue.main.async {
            S_Log._F_(description: C_FirebaseStorageService.ACTIVITY_NAME + " : [Firebase] [Storage] 특정 파일 다운 로드 URL 확인 수행", data: [
                "filePath :: \(filePath)",
                "fileName :: \(fileName)"
            ])
            
            
            // [널 체크]
            if C_Util().stringNotNull(str: filePath) == true && C_Util().stringNotNull(str: fileName) == true {
                
                // [Storage 인스턴스 지정]
                let storage = Storage.storage() //인스턴스 생성
                
                // [Storage 에 파일 업로드]
                storage.reference().child(filePath).listAll { (result, error) in
                    if let error = error {
                        S_Log._F_(description: C_FirebaseStorageService.ACTIVITY_NAME + " : [Firebase] [Storage] [Error] - 특정 파일 다운 로드 URL 확인 에러", data: [
                            "ERROR :: \(error.localizedDescription)"
                        ])
                        
                        // [콜백 반환]
                        completion("")
                        return
                    }
                    
                    // [result 널 체크]
                    if result != nil && result?.items.count ?? 0 > 0 {
                        
                        var search_item:StorageReference? = nil
                        
                        for item in result!.items {
                            
                            // [파일 명칭 체크 확인]
                            if fileName == item.name.description {
                                
                                // [변수에 삽입]
                                search_item = item
                                break
                            }
                        }
                        
                        // [다운로드 URL 확인]
                        if search_item != nil {
                            
                            var downUrl = ""
                            
                            search_item?.downloadURL(completion: { URL, Error in
                                if (error != nil) {
                                    S_Log._F_(description: C_FirebaseStorageService.ACTIVITY_NAME + " : [Firebase] [Storage] [Error] - 특정 파일 다운 로드 URL 확인 에러", data: [
                                        "ERROR :: downloadURL is null"
                                    ])
                                    
                                    // [콜백 반환]
                                    completion("")
                                    return
                                }
                                
                                downUrl = URL?.absoluteString ?? ""
                                
                                if downUrl.hasPrefix("http") == true && downUrl.contains("firebase") == true {
                                 
                                    // [리턴 반환 수행]
                                    S_Log._F_(description: C_FirebaseStorageService.ACTIVITY_NAME + " : [Firebase] [Storage] [Success] - 특정 파일 다운 로드 URL 확인 성공 [1]", data: [
                                        "RETURN :: \(downUrl)"
                                    ])
                                    
                                    // [콜백 반환]
                                    completion(downUrl)
                                    
                                }
                                else {
                                    
                                    downUrl = "https://firebasestorage.googleapis.com" + downUrl
                                    
                                    // [리턴 반환 수행]
                                    S_Log._F_(description: C_FirebaseStorageService.ACTIVITY_NAME + " : [Firebase] [Storage] [Success] - 특정 파일 다운 로드 URL 확인 성공 [2]", data: [
                                        "RETURN :: \(downUrl)"
                                    ])
                                    
                                    // [콜백 반환]
                                    completion(downUrl)
                                    
                                }
                                
                            })
                        }
                        else {
                            S_Log._F_(description: C_FirebaseStorageService.ACTIVITY_NAME + " : [Firebase] [Storage] [Error] - 특정 파일 다운 로드 URL 확인 에러", data: [
                                "ERROR :: search_item is null"
                            ])
                            
                            // [콜백 반환]
                            completion("")
                        }
                        
                    }
                    else {
                        S_Log._F_(description: C_FirebaseStorageService.ACTIVITY_NAME + " : [Firebase] [Storage] [Error] - 특정 파일 다운 로드 URL 확인 에러", data: [
                            "ERROR :: firebase save list is null"
                        ])
                        
                        // [콜백 반환]
                        completion("")
                    }
                }
            }
            else {
                S_Log._F_(description: C_FirebaseStorageService.ACTIVITY_NAME + " : [Firebase] [Storage] [Error] - 특정 파일 다운 로드 URL 확인 에러", data: [
                    "ERROR :: Input Data Is Null"
                ])
                
                // [콜백 반환]
                completion("")
            }
            
        }
    }

    
} // [클래스 종료]

 

반응형
Comments