从Firebase存储下载并查看ios中的文档

时间:2018-06-25 05:33:14

标签: ios swift firebase firebase-storage

我有一个文档的Firebase存储链接,该链接要下载到ios设备的文档目录中,然后使用QuickLook模块从那里查看。 我可以在iOS设备上下载文档,但无法使用我提供的名称进行保存。 我想创建以下目录结构,然后将文档保存在“ doc”文件夹中。 文档/聊天/文档

以下代码是在Iphone的Document目录中创建“ / chat / doc”。 folderName将包含“ / chat / doc”。

    func createDocument(folderName: String ,completion: @escaping(Bool,String)->()){
    let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first
    if let documentsDirectory = path{
        //
        let docDirectoryPath =  documentsDirectory.appending(folderName)
        let fileManager = FileManager.default

        if !fileManager.fileExists(atPath: docDirectoryPath) {
            do {
                try fileManager.createDirectory(atPath: docDirectoryPath,
                                                withIntermediateDirectories: true,
                                                attributes: nil)
                //return path on success
                completion(true,docDirectoryPath)
                return
            } catch {
                print("Error creating folder in documents dir: \(error.localizedDescription)")
                completion(false,error.localizedDescription)
                return
            }
        }
        completion(true,docDirectoryPath)
    }
}

创建文件夹后,我要下载文档,并且需要存储在文档目录中新创建的文件夹中。

以下代码将下载文档。

func downloadDocument(){

    createDocument(folderName: "/chat/doc") { (status, path) in
        if let docURL = self.documentURL{
            if status{
                //folder is created now download document

                let docDownloadRef = Storage.storage().reference(forURL: docURL)

                //get documents metadata from firebase to get document name
                docDownloadRef.getMetadata { metadata, error in
                    if let error = error {
                        // Uh-oh, an error occurred!
                    } else {
                        //get document name from metadata

                        if let fileName = metadata?.name{

                            //create file system url to store document
                            let docsurl = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)

                            let myurl = docsurl.appendingPathComponent("chat/\(fileName)")

                            _ = docDownloadRef.write(toFile: myurl) { url, error in
                                if let error = error {
                                    print(error.localizedDescription)
                                } else {
                                    // Local file URL for document is returned
                                    print("doc url \(url?.absoluteString)")
                                }
                            }
                        }
                    }
                }

            }else{
                //folder is not created show document using online location
            }
        }
    }
}

Ultimate goal is to achieve something like this "Documents/chat/doc/abc.doc"

但是我的代码没有使用文件名来存储文档,而是以“ Documents / chat / doc”这样的文件名存储文件,其中doc被视为文档而不是文件夹。

请帮助让我知道我做错了什么。 谢谢。

1 个答案:

答案 0 :(得分:0)

在下一行创建url时,这里缺少doc文件夹的路径。

let myurl = docsurl.appendingPathComponent("chat/\(fileName)")

这将保存到chat文件夹。您需要在创建folderName: "/chat/doc"时传递相同的文件夹,所以它应该是

let myurl = docsurl.appendingPathComponent("chat/doc/\(fileName)")