iOS 客戶端從服務器下載word文檔,緩存並瀏覽(swift)

背景:

  • 服務器端通過接口返回word文檔base64編碼字符串
  • 客戶端需求是緩存預覽分享等

 

處理思路

  1. 請求接口下載base64字符串
  2. base64解碼轉成Data
  3. 在 Document創建文件夾,在文件夾下創建文件
  4. 將Data寫入文件
  5. 使用QuickLook預覽,展示。
     

下載和文件代碼


//  下載文件類
//  LoadFilesManager.swift
//  NVRCloudIOS
//
//  Created by Nvr on 2018/12/28.
//  Copyright © 2018 zhangyu. All rights reserved.
//

import UIKit
import Alamofire
import MBProgressHUD
import SwiftyJSON

class LoadFilesManager: NSObject {

    static let shared = LoadFilesManager()
    let filesManager = FileManager.default

    //創建文件夾的根目錄
    var rootPath:URL?{
        return filesManager.urls(for: .documentDirectory, in: .userDomainMask).first
    }

    //下載合同
    func loadContract(contractNo:String,callBack:@escaping UpdateCallBack) {

        let progressHud = MBProgressHUD.showAdded(to: UIApplication.shared.keyWindow!, animated: true)
        progressHud.mode = .annularDeterminate
        progressHud.label.text = "下載中..."
        if let path = rootPath {
            //如果存在文件夾,創建文件
            if createFolder(name: "Contract", baseUrl: path as NSURL){
                let result = creatFlie(fliesName: "/Contract/\(contractNo).docx")
                if result.0{
                    let urlString = String(format: GlobalConfig.RentalPath.downLoadContract,contractNo)
                    guard let url = URL(string: urlString) else{
                        return
                    }
                    restApiService.setAlamofireHeader(contentType: ContentType.JSON, url: urlString)
                    let request = Alamofire.request(url, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: header)
                    request.downloadProgress(closure: { (progress) in
                        progressHud.progressObject = progress
                    }).responseJSON { (respons) in
                        DispatchQueue.main.async {
                            progressHud.hide(animated: true)
                        }
                        switch respons.result {
                        case .success(let value):
                            guard let docString = JSON(value)["result"].string else{
                                return
                            }
                            do {
                                let base64Data = Data.init(base64Encoded: docString, options: [])
                                try base64Data?.write(to: URL(fileURLWithPath: result.1))
                                callBack()
                            }catch{
                                NVRLOG("寫入失敗")
                            }
                        case .failure:
                            break
                        }
                    }
                }
            }
        }
    }

}

//文件操作相關
extension LoadFilesManager{

    //創建文件夾
    func createFolder(name:String,baseUrl:NSURL) -> Bool{
        do {
            if let folder = baseUrl.appendingPathComponent(name, isDirectory: true){
                let exist = filesManager.fileExists(atPath: folder.path)
                if !exist {
                    try filesManager.createDirectory(at: folder, withIntermediateDirectories: true,
                                                 attributes: nil)
                }
                return true
            }
            return false
        }catch{
            NVRLOG("創建失敗")
            return false
        }
    }

    //創建文件
    func creatFlie(fliesName:String) -> (Bool,String){
        guard let rootPath = rootPath?.path else {
            return (false,"")
        }
        let path = rootPath + fliesName
        let exist = filesManager.fileExists(atPath: path)
        if !exist{
            if filesManager.createFile(atPath: path, contents: nil, attributes: nil){
                NVRLOG("文件創建成功")
                return (true,path)
            }else{
                NVRLOG("創建失敗")
                return (false,path)
            }
        }
        return (true,path)
    }

    //判斷文件是否存在
    func existDownLoadContract(contractNo:String) -> Bool{
        guard let rootPath = rootPath?.path else {
            return false
        }
        let path = rootPath + "/Contract/\(contractNo).docx"
        let exist = filesManager.fileExists(atPath: path)
        return exist
    }

    //獲取Document文件夾下所有文件
    func getFilesInFolder(subPath:String) -> [String]{
        guard let rootPath = rootPath?.path else {
            return []
        }
        let path = rootPath + "/Contract/"
        let dirEnum = filesManager.enumerator(atPath: path)
        var contractNoPaths = [String]()
        while let file = dirEnum?.nextObject() as? String{
            if file.hasSuffix(".docx") || file.hasSuffix(".doc"){
                contractNoPaths.append(path+file)
            }
        }
        return contractNoPaths
    }
}

預覽相關代碼


//
//  ContractDetailViewController+QuickLook.swift
//  NVRCloudIOS
//
//  Created by Nvr on 2018/12/29.
//  Copyright © 2018 zhangyu. All rights reserved.
//

import Foundation
import QuickLook


extension ContactDetailViewController:QLPreviewControllerDelegate,QLPreviewControllerDataSource{

    func jumpToQuickLook(contractNo:String){
        allDownLoadsContract = LoadFilesManager.shared.getFilesInFolder(subPath: "/Contract")
        var currentIndex = 0
        guard let list = allDownLoadsContract else{
            return
        }
        for (index,filePath) in list.enumerated() {
            if filePath.contains(contractNo){
                currentIndex = index
            }
        }
        let qlVc = QLPreviewController.init()
        qlVc.delegate = self
        qlVc.dataSource = self
        qlVc.currentPreviewItemIndex = currentIndex
        self.navigationController?.pushViewController(qlVc, animated: true)
    }


    func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
        return allDownLoadsContract?.count ?? 0
    }

    func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
        guard let list = allDownLoadsContract else{
            return NSURL(fileURLWithPath:"")
        }
        return NSURL(fileURLWithPath: list[index])
    }


}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章