前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS 客户端从服务器下载word文档,缓存并浏览(swift)

iOS 客户端从服务器下载word文档,缓存并浏览(swift)

作者头像
星宇大前端
发布2020-02-13 12:52:59
2.6K0
发布2020-02-13 12:52:59
举报
文章被收录于专栏:大宇笔记大宇笔记

背景:

  • 服务器端通过接口返回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])
    }


}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-01-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景:
  • 处理思路
  • 下载和文件代码
  • 预览相关代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档