背景:
- 服務器端通過接口返回word文檔base64編碼字符串
- 客戶端需求是緩存預覽分享等
處理思路
- 請求接口下載base64字符串
- base64解碼轉成Data
- 在 Document創建文件夾,在文件夾下創建文件
- 將Data寫入文件
- 使用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])
}
}