【问题标题】:Swift data write to Document directory maintaining directory structureSwift数据写入Document目录维护目录结构
【发布时间】:2017-01-10 14:31:31
【问题描述】:

我正在从 firebase 下载文件。假设请求网址如下

social-cam-storage/albm-72/owner-2/1484043313786.jpeg

我可以使用以下代码下载文件

func downloadFile(url : String) {
        let storageR = FIRStorage.storage().reference(withPath: url)
        let maxSize : Int64 = 3 * 1024 * 1024  // 3MB

        storageR.data(withMaxSize: maxSize) { (data, error) in
            if error != nil {
                print(error.debugDescription)
                return
            }

            print(data!)
        }

    }

现在我需要存储这些数据来维护 url 的目录结构

我试过了

let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
print(FileManager.default.createFile(atPath: "\(documentsURL.absoluteString)/\(url)", contents: data!, attributes: nil))

但我是假的

那么如何解决这个问题,或者有其他方法可以保存吗??

【问题讨论】:

    标签: ios swift firebase firebase-storage


    【解决方案1】:

    你尝试过这样的事情吗? :

    如果您已经将确切路径作为字符串:

    try? data.write(to: URL(fileURLWithPath: path), options: [.atomic])
    

    如果你需要路径,有几个方法:

    func saveFile() {
        let filePath = getDocumentsURL().absoluteString.appending(path)
        try? data.write(to: URL(fileURLWithPath: filePath), options: [.atomic])
    }
    
    func getDocumentsURL() -> URL {
        let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
        return documentsURL
    }
    

    您也可以尝试保存文件名,然后在需要时加载:

    func fileInDocumentsDirectory(_ filename: String) -> String {
        let fileURL = getDocumentsURL().appendingPathComponent(filename)
        return fileURL.path
    }
    
    // To save file
    func saveFile(data: Data) {
        let fileName:String = "createUniqueFileName"
        let filePath = fileInDocumentsDirectory(fileName)
        saveData(data, filePath)
    }
    
    // To load file with saved file name
    func loadFile(fileName: String) {
    
        if let loadedData = loadData(fileName) {
             // Handle data however you wish
        }
    
    }
    
    func saveData(_ data: Data, path: String ) {
    
        try? data.write(to: URL(fileURLWithPath: path), options: [.atomic])
    
    }
    
    func loadData(_ path: String) -> Data? {
    
        let data:Data? = try? Data(contentsOf: URL(fileURLWithPath: path))
    
        return data
    
    }
    

    【讨论】:

    • 它不起作用。收到错误The file “1484043866188.jpeg” doesn’t exist.
    【解决方案2】:

    您是否尝试过在 Firebase 存储中使用内置的“download to file”API?

    // Create a reference to the file you want to download
    let fileURL = storage.reference(withPath: url)
    
    // Create local filesystem URL
    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    let fileURL = ... 
    
    // Download to the local filesystem
    let downloadTask = islandRef.write(toFile: fileURL) { url, error in
      if let error = error {
        // Uh-oh, an error occurred!
      } else {
        // Local file URL is returned
      }
    }
    

    【讨论】:

    • 我首先尝试了这个并且得到以下错误CFURLCopyResourcePropertyForKey failed because it was passed an URL which has no scheme Could not remove previous file at /private/var/mobile/Containers/Data/Application/2E4C0A6F-FE93-41AD-9D82-AA501A7C83B6/tmp/CFNetworkDownload_CNxpX3.tmp due to Error Domain=NSCocoaErrorDomain Code=262 "The file couldn’t be opened because the specified URL type isn’t supported." UserInfo={NSURL=social-cam-storage/albm-70/owner-2/1484043866188.jpeg} An unknown error occurred, please check the server response.
    • 错误很合理,“无法打开文件,因为不支持指定的 URL 类型。”您需要有一个 iOS 可以理解的 URL 方案,即:file:///Documents/social-cam-storage/albm-70/owner-2/148404386‌​6188.jpeg 或您想要使用的任何合适的目录(请注意,由于设备上的沙盒,您只能使用 Documentstmp)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2013-09-11
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多