iOS/코드조각

[iOS, Swift] DocumentPicker로 선택한 파일 저장하기

검은참깨두유vm 2023. 3. 5. 00:01
반응형

iOS 16.1, Xcode 14.2, Swift 5, UIKit 환경에서 진행했습니다.

 

 

DocumentPicker에 관한 기본적인 예제 참고 사이트

https://bksesame.tistory.com/207

 

[iOS, Swift] DocumentPicker 사용예제

iOS 16.1, Xcode 14.2, Swift 5, UIKit 환경에서 진행했습니다. DocumentPickerController에서 forOpeningContentTypes의 타입을 설정하고 초기화를 한 후 present로 pickerController를 띄어준다.설정된 타입은 png로 하였는데,

bksesame.tistory.com

 

DocumentPicker에서 파일을 선택할 시에 파일을 내 앱으로 저장하는 방법에 대하여 포스팅하겠습니다.

DocumentPicker에서 파일을 선택하게 되면 UIDocumentPickerDelegate에 있는 documentPicker(... didPickDocumentsAt urls:[URL]) 함수가 호출됩니다.

이 함수에서 선택한 파일의 URL이 urls 속성에 담기게 됩니다.

이 URL 주소를 통해 파일을 저장하면 됩니다. 

 

 

파일 처리에 관한 예제

https://bksesame.tistory.com/211

 

 

전체코드

extension ViewController: UIDocumentPickerDelegate, UINavigationControllerDelegate {
    func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
        let fileManager = FileManager.default
        let documentURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
        let directoryURL = documentURL.appendingPathComponent("folder")
        
        // 폴더 생성
        do {
            try fileManager.createDirectory(atPath: directoryURL.path, withIntermediateDirectories: false, attributes: nil)
        } catch let e as NSError {
            print(e.localizedDescription)
        }
        
        let newUrls = urls.compactMap { (url: URL) -> URL? in
            var tempURL = directoryURL
            tempURL.appendPathComponent(url.lastPathComponent)
            do {
            	// 중복된 파일이 있을 경우 제거
                if fileManager.fileExists(atPath: tempURL.path) {
                    try? fileManager.removeItem(atPath: tempURL.path)
                }
                
                // 파일 복제
                try FileManager.default.moveItem(atPath: url.path, toPath: tempURL.path)
                fileURL = tempURL
                return tempURL
            } catch {
                print(error.localizedDescription)
                return nil
            }
        }
    }
}
반응형