투케이2K

358. (ios/swift5) [유틸 파일] 파일 매니저 GET 방식 URL 주소에 파일 확장자 명 포함 및 파일 다운로드 수행 - FileManager 본문

IOS

358. (ios/swift5) [유틸 파일] 파일 매니저 GET 방식 URL 주소에 파일 확장자 명 포함 및 파일 다운로드 수행 - FileManager

투케이2K 2023. 10. 29. 15:22
반응형

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT5

 

[소스 코드]

    // -----------------------------------------------------------------------------------------
    // MARK: - [GET 방식 URL 주소에 파일 확장자 명 포함 및 파일 다운로드 수행]
    // -----------------------------------------------------------------------------------------
    func requestGetAsyncFileExtensionHttp(tag: String, url: String, header: Dictionary<String, Any>?, saveName: String, completion: @escaping (Bool, String)->()) {
        
        /*
         // -----------------------------------------
         [requestGetAsyncFileExtensionHttp 메소드 설명]
         // -----------------------------------------
         1. GET 방식 URL 주소에 파일 확장자 명 포함 및 파일 다운로드 수행
         // -----------------------------------------
         2. 호출 방법 :
         
         let tag_ = "파일 다운 로드 요청"
         let url_ = "http://dev.test.co.kr:4800/FileTest/test.png"
         let header_ : Dictionary<String, Any> = [:]
         let fileName = "test.png"
         
         
         N_AsyncHttp().requestGetAsyncFileExtensionHttp(tag: tag_, url: url_, header: header_, saveName: fileName){(result, response) in
             
             S_Log._D_(description: "HTTP 콜백 결과 확인", data: [response])
             
         }
         // -----------------------------------------
         3. 사전 설정 사항 :
         
         - 필요 info plist 설정
         [1] http 허용 : App Transport Security Settings >> Allow Arbitrary Loads >> YES
         [2] 파일 저장 : Privacy - Access to a File Provide Domain Usage Description
         // -----------------------------------------
         4. 참고 로직 :
         
         // TODO [1] : URL 주소에 파일 확장자 명이 포함된 도메인 호출
         // TODO [2] : HTTP 파일 다운로드
         // -----------------------------------------
         */
        
        
        // -----------------------------------------
        // [url 선언 실시]
        // -----------------------------------------
        var urlData = String(describing: url)
        
        if C_Util().stringNotNull(str: urlData) == false {
            
            // [콜백 반환]
            completion(false, "[ERROR] :: URL Data Is Null")
            return
            
        }
        // -----------------------------------------
        
        
        // -----------------------------------------
        // [파일 확장자 포함 체크 실시]
        // -----------------------------------------
        if C_Util().stringNotNull(str: C_Util().urlFileExtensionName(string: urlData)) == false {
            
            // [콜백 반환]
            completion(false, "[ERROR] :: File Extension Is Null")
            return
            
        }
        // -----------------------------------------
        
        
        // -----------------------------------------
        // [저장 파일 명칭 널 체크]
        // -----------------------------------------
        if C_Util().stringNotNull(str: saveName) == false {
            
            // [콜백 반환]
            completion(false, "[ERROR] :: File Save Name Is Null")
            return
            
        }
        // -----------------------------------------
        
        
        // -----------------------------------------
        // [URLRequest 생성 실시]
        // -----------------------------------------
        let urlComponents = URLComponents(string: urlData)
        var requestURL = URLRequest(url: (urlComponents?.url)!)
        
        requestURL.httpMethod = "GET"
        
        requestURL.addValue("application/x-www-form-urlencoded; charset=utf-8;", forHTTPHeaderField: "Content-Type") // header settings
        requestURL.addValue("no-cache", forHTTPHeaderField: "Cache-Control") // header settings
        
        if C_Util().dicNotNull(dic_: header) == true {
            
            for key in header!.keys {
                
                requestURL.addValue("\(String(describing: header![key] ?? ""))", forHTTPHeaderField: "\(key)")
                
            }

        }
        
        
        S_Log._D_(description: "비동기 GET 방식 파일 다운 로드 HTTP [요청] 수행", data: [
            "TAG :: " + String(describing: tag),
            "TYPE :: GET >> REQUEST",
            "URL :: " + String(describing: urlData),
            "HEADER :: " + String(describing: header),
            "SAVE_NAME :: " + String(describing: saveName)
        ])
        
        
        // -----------------------------------------
        // [http 요쳥을 위한 URLSessionDataTask 생성]
        // -----------------------------------------
        let sessionConfig = URLSessionConfiguration.default
        sessionConfig.timeoutIntervalForRequest = N_AsyncHttp.connectTimeout // [커넥션 타임 아웃 설정]
        let session = URLSession(configuration: sessionConfig)
        
        let dataTask = session.dataTask(with: requestURL, completionHandler: { (data, response, error) in

            // [error가 존재하면 종료]
            guard error == nil else {
                S_Log._D_(description: "비동기 GET 방식 파일 다운 로드 HTTP [결과] 실패", data: [
                    "TAG :: " + String(describing: tag),
                    "TYPE :: GET >> FAIL",
                    "URL :: " + String(describing: urlData),
                    "HEADER :: " + String(describing: header),
                    "SAVE_NAME :: " + String(describing: saveName),
                    "ERROR :: \(error?.localizedDescription ?? "")"
                ])
                
                // [콜백 반환]
                completion(false, "[ERROR] :: \(error?.localizedDescription ?? "")")
                return
            }

            
            // [status 코드 체크 실시]
            let successsRange = 200..<300
            guard let statusCode = (response as? HTTPURLResponse)?.statusCode, successsRange.contains(statusCode)
            else {
                S_Log._D_(description: "비동기 GET 방식 파일 다운 로드 HTTP [결과] 에러", data: [
                    "TAG :: " + String(describing: tag),
                    "TYPE :: GET >> ERROR",
                    "URL :: " + String(describing: urlData),
                    "HEADER :: " + String(describing: header),
                    "SAVE_NAME :: " + String(describing: saveName),
                    "STATUS CODE :: " + String(describing: (response as? HTTPURLResponse)?.statusCode ?? 0),
                    "RESPONSE DATA :: \((response as? HTTPURLResponse)?.description ?? "")"
                ])
                
                // [콜백 반환]
                completion(false, "[ERROR] :: \((response as? HTTPURLResponse)?.description ?? "")")
                return
            }

            
            // [response 데이터 획득]
            let resultCode = (response as? HTTPURLResponse)?.statusCode ?? 0 // [상태 코드]
            let resultData = data! // [데이터 확인]
            let resultType = response?.mimeType // [데이터 타입]
            
            
            // [파일 저장 실시]
            let fileManager = FileManager.default // 파일 매니저 선언
            var documentsUrl =  fileManager.urls(for: .documentDirectory, in: .userDomainMask).first! // 기본 경로 확인
            
            documentsUrl = documentsUrl.appendingPathComponent(saveName) // 파일 명칭
            
            let fileSavePath = documentsUrl
            
            
            S_Log._D_(description: "비동기 GET 방식 파일 다운 로드 HTTP [결과] 확인", data: [
                "TAG :: " + String(describing: tag),
                "TYPE :: GET >> RESPONSE",
                "URL :: " + String(describing: urlData),
                "HEADER :: " + String(describing: header),
                "FILE PATH :: " + String(describing: fileSavePath.description),
                "STATUS CODE :: " + String(describing: resultCode),
                "RESPONSE TYPE :: " + String(describing: resultType),
                "RESPONSE DATA :: " + String(describing: resultData)
            ])
            
            
            // [파일 저장 수행 실시]
            if let file = data {
                
                // [설정한 경로에 파일 저장]
                if let _ = try? file.write(to: fileSavePath, options: Data.WritingOptions.atomic) {
                    S_Log._D_(description: "비동기 GET 방식 파일 다운 로드 :: 파일 저장 :: [Success] :: File Download", data: nil)
                    
                    // [콜백 반환]
                    completion(true, "[Success] :: File Download")
                    return
                    
                }
                else {
                    S_Log._D_(description: "비동기 GET 방식 파일 다운 로드 :: 파일 저장 :: [ERROR] :: File Write Error", data: nil)
                    
                    // [콜백 반환]
                    completion(false, "[ERROR] :: File Write Error")
                    return
                }
            }
            else {
                S_Log._D_(description: "비동기 GET 방식 파일 다운 로드 :: 파일 저장 :: [ERROR] :: Data Parsing Error", data: nil)
                
                // [콜백 반환]
                completion(false, "[ERROR] :: Data Parsing Error")
                return
                
            }
            
        })

        
        // [network 통신 실행]
        dataTask.resume()
    }
 

[결과 출력]

 

================================================================
LOG :: CLASS PLACE :: N_AsyncHttp.swift :: requestGetAsyncFileExtensionHttp(tag:url:header:saveName:completion:) :: 1136
-------------------------------------------------
LOG :: NOW TIME :: 2023-10-29 15:12:55
-------------------------------------------------
LOG :: DESCRIPTION :: 비동기 GET 방식 파일 다운 로드 HTTP [요청] 수행
-------------------------------------------------
LOG :: TAG :: 파일 다운 로드 요청
-------------------------------------------------
LOG :: TYPE :: GET >> REQUEST
-------------------------------------------------
LOG :: URL :: http://dev.test.co.kr:4800/FileTest/test.png
-------------------------------------------------
LOG :: HEADER :: Optional([:])
-------------------------------------------------
LOG :: SAVE_NAME :: test.png
================================================================



================================================================
LOG :: CLASS PLACE :: N_AsyncHttp.swift :: requestGetAsyncFileExtensionHttp(tag:url:header:saveName:completion:) :: 1206
-------------------------------------------------
LOG :: NOW TIME :: 2023-10-29 15:12:56
-------------------------------------------------
LOG :: DESCRIPTION :: 비동기 GET 방식 파일 다운 로드 HTTP [결과] 확인
-------------------------------------------------
LOG :: TAG :: 파일 다운 로드 요청
-------------------------------------------------
LOG :: TYPE :: GET >> RESPONSE
-------------------------------------------------
LOG :: URL :: http://dev.test.co.kr:4800/FileTest/test.png
-------------------------------------------------
LOG :: HEADER :: Optional([:])
-------------------------------------------------
LOG :: FILE PATH :: file:///var/mobile/Containers/Data/Application/26AE6E34-8BEC-43CF-BB87-3DAD0469FFE6/Documents/test.png
-------------------------------------------------
LOG :: STATUS CODE :: 200
-------------------------------------------------
LOG :: RESPONSE TYPE :: Optional("image/png")
-------------------------------------------------
LOG :: RESPONSE DATA :: 656 bytes
================================================================



================================================================
LOG :: CLASS PLACE :: N_AsyncHttp.swift :: requestGetAsyncFileExtensionHttp(tag:url:header:saveName:completion:) :: 1223
-------------------------------------------------
LOG :: NOW TIME :: 2023-10-29 15:12:56
-------------------------------------------------
LOG :: DESCRIPTION :: 비동기 GET 방식 파일 다운 로드 :: 파일 저장 :: [Success] :: File Download
================================================================

 

반응형
Comments