MainFileViewController.swift 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078
  1. //
  2. // MainFileViewController.swift
  3. // O2Platform
  4. //
  5. // Created by 刘振兴 on 16/8/17.
  6. // Copyright © 2016年 zoneland. All rights reserved.
  7. //
  8. import UIKit
  9. import Alamofire
  10. import AlamofireImage
  11. import AlamofireObjectMapper
  12. import SwiftyJSON
  13. import ObjectMapper
  14. import BSImagePicker
  15. import Photos
  16. import QuickLook
  17. import CocoaLumberjack
  18. import O2OA_Auth_SDK
  19. private let kLivelyRedColor = base_color
  20. class MainFileViewController: UIViewController {
  21. @IBOutlet weak var tableView: ZLBaseTableView!
  22. var myFiles:[OOFile] = []
  23. var myFileShare:[FileShare] = []
  24. var myFileRecive:[FileShare] = []
  25. //移动选择的文件夹
  26. var moveSourceFile:OOFile?
  27. var moveTargeFolder:OOFile?
  28. //分享的人员列表
  29. var sharedPersons:[PersonV2] = []
  30. //分享的文件
  31. var currentSharedFile:OOFile?
  32. //文件夹深度队列
  33. var folderQueue:[OOFile] = []
  34. var segmentedControl:SegmentedControl?{
  35. didSet {
  36. tabIndex = (segmentedControl?.selectedIndex)!
  37. }
  38. }
  39. var tabIndex:Int = 0
  40. //预览
  41. let quickLookController = QLPreviewController()
  42. var fileURLs = [URL]()
  43. override func viewDidLoad() {
  44. super.viewDidLoad()
  45. //self.tableView.registerClass(Class() , forCellReuseIdentifier: "FileShareTableViewCell")
  46. setupUI()
  47. self.tableView.contentInset = UIEdgeInsets(top: 40.0, left: 0, bottom: 0, right: 0)
  48. self.tableView.delegate = self
  49. self.tableView.dataSource = self
  50. self.tableView.mj_header = MJRefreshNormalHeader(refreshingBlock: {
  51. self.loadDataByTabIndex(tabIndex: self.tabIndex)
  52. })
  53. self.loadDataByTabIndex(tabIndex:tabIndex)
  54. quickLookController.dataSource = self
  55. quickLookController.delegate = self
  56. }
  57. func loadDataRequestFileCompleted(_ url:String){
  58. self.showMessage(title: "加载中")
  59. Alamofire.request(url).responseJSON { response in
  60. self.myFiles.removeAll()
  61. switch response.result {
  62. case .success(let val):
  63. let type = JSON(val)["type"]
  64. if type == "success" {
  65. let json = JSON(val)["data"]
  66. let files = Mapper<OOFile>().mapArray(JSONString:json["attachmentList"].description)
  67. let folders = Mapper<OOFile>().mapArray(JSONString:json["folderList"].description)
  68. DispatchQueue.main.async {
  69. self.myFiles.append(contentsOf: files!)
  70. self.myFiles.append(contentsOf: folders!)
  71. self.tableView.reloadData()
  72. self.showSuccess(title: "加载完成")
  73. }
  74. }else{
  75. DispatchQueue.main.async {
  76. DDLogError(JSON(val).description)
  77. self.tableView.reloadData()
  78. self.showError(title: "加载失败")
  79. }
  80. }
  81. case .failure(let err):
  82. DispatchQueue.main.async {
  83. DDLogError(err.localizedDescription)
  84. self.tableView.reloadData()
  85. self.showError(title: "加载失败")
  86. }
  87. }
  88. DispatchQueue.main.async {
  89. if self.tableView.mj_header.isRefreshing(){
  90. self.tableView.mj_header.endRefreshing()
  91. }
  92. }
  93. }
  94. }
  95. func loadDataRequestFileShareCompleted(_ url:String){
  96. self.showMessage(title: "加载中")
  97. Alamofire.request(url).responseArray(queue: nil, keyPath: "data", context: nil)
  98. { (response:DataResponse<[FileShare]>) in
  99. self.myFileShare.removeAll()
  100. debugPrint(response.result)
  101. switch response.result {
  102. case .success(let shares):
  103. DispatchQueue.main.async {
  104. self.myFileShare.append(contentsOf: shares)
  105. self.tableView.reloadData()
  106. self.showSuccess(title: "加载完成")
  107. }
  108. case .failure(let err):
  109. DispatchQueue.main.async {
  110. DDLogError(err.localizedDescription)
  111. self.tableView.reloadData()
  112. self.showError(title: "加载失败")
  113. }
  114. }
  115. DispatchQueue.main.async {
  116. if self.tableView.mj_header.isRefreshing(){
  117. self.tableView.mj_header.endRefreshing()
  118. }
  119. }
  120. }
  121. }
  122. func loadDataRequestFileReciveCompleted(_ url:String) {
  123. self.showMessage(title: "加载中")
  124. Alamofire.request(url).responseArray(queue: nil, keyPath: "data", context: nil) {
  125. (response:DataResponse<[FileShare]>) in
  126. self.myFileRecive.removeAll()
  127. switch response.result {
  128. case .success(let shares):
  129. DispatchQueue.main.async {
  130. self.myFileRecive.append(contentsOf: shares)
  131. self.tableView.reloadData()
  132. self.showSuccess(title: "加载完成")
  133. }
  134. case .failure(let err):
  135. DispatchQueue.main.async {
  136. DDLogError(err.localizedDescription)
  137. self.tableView.reloadData()
  138. self.showError(title: "加载失败")
  139. }
  140. }
  141. DispatchQueue.main.async {
  142. if self.tableView.mj_header.isRefreshing(){
  143. self.tableView.mj_header.endRefreshing()
  144. }
  145. }
  146. }
  147. }
  148. func loadDataByTabIndex(tabIndex index:Int){
  149. //计算URL
  150. var url = ""
  151. switch index {
  152. case 0:
  153. self.tableView.emptyTitle = "没有文件数据"
  154. if self.folderQueue.count <= 0 {
  155. url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileTopListQuery, parameter: nil)!
  156. self.loadDataRequestFileCompleted(url)
  157. }else{
  158. let f = self.folderQueue.last
  159. //读取
  160. let url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileFolderItemIdQuery, parameter: ["##id##":f!.id! as AnyObject])
  161. self.loadDataRequestFileCompleted(url!)
  162. }
  163. case 1:
  164. self.tableView.emptyTitle = "没有收到共享的文件"
  165. url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileShareQuery, parameter: nil)!
  166. self.loadDataRequestFileShareCompleted(url)
  167. case 2:
  168. self.tableView.emptyTitle = "没有共享文件给其它人"
  169. url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileEditorQuery, parameter: nil)!
  170. self.loadDataRequestFileReciveCompleted(url)
  171. default:
  172. url = ""
  173. }
  174. }
  175. func setupUI(){
  176. self.initSegmentedControl()
  177. }
  178. func initSegmentedControl(){
  179. let titleStrings = ["我的文件","共享文件","收到文件"]
  180. let titles: [NSAttributedString] = {
  181. let attributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 16), NSAttributedString.Key.foregroundColor: UIColor.black]
  182. var titles = [NSAttributedString]()
  183. for titleString in titleStrings {
  184. let title = NSAttributedString(string: titleString, attributes: attributes)
  185. titles.append(title)
  186. }
  187. return titles
  188. }()
  189. let selectedTitles: [NSAttributedString] = {
  190. let attributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 16), NSAttributedString.Key.foregroundColor: kLivelyRedColor]
  191. var selectedTitles = [NSAttributedString]()
  192. for titleString in titleStrings {
  193. let selectedTitle = NSAttributedString(string: titleString, attributes: attributes)
  194. selectedTitles.append(selectedTitle)
  195. }
  196. return selectedTitles
  197. }()
  198. self.segmentedControl = SegmentedControl.initWithTitles(titles, selectedTitles: selectedTitles)
  199. self.segmentedControl!.delegate = self
  200. self.segmentedControl!.backgroundColor = toolbar_background_color
  201. self.segmentedControl!.autoresizingMask = [.flexibleRightMargin, .flexibleWidth]
  202. self.segmentedControl!.selectionIndicatorStyle = .bottom
  203. self.segmentedControl!.selectionIndicatorColor = kLivelyRedColor
  204. self.segmentedControl!.selectionIndicatorHeight = 3
  205. self.segmentedControl!.segmentWidth = SCREEN_WIDTH / 3
  206. self.segmentedControl!.frame.origin.y = 0
  207. self.segmentedControl!.frame.size = CGSize(width: UIScreen.main.bounds.width, height: 40)
  208. view.insertSubview(self.segmentedControl!, belowSubview: navigationController!.navigationBar)
  209. }
  210. override func didReceiveMemoryWarning() {
  211. super.didReceiveMemoryWarning()
  212. }
  213. @IBAction func showMyFile(_ sender: UIBarButtonItem) {
  214. self.performSegue(withIdentifier: "showMyDownloadSegue", sender: nil)
  215. }
  216. @IBAction func backToHome(_ sender: UIBarButtonItem) {
  217. let backType = AppConfigSettings.shared.appBackType
  218. if backType == 1 {
  219. self.performSegue(withIdentifier: "backToMain", sender: nil)
  220. }else if backType == 2 {
  221. self.performSegue(withIdentifier: "backToApps", sender: nil)
  222. }
  223. }
  224. @IBAction func uploadFileMenu(_ sender: UIBarButtonItem) {
  225. let menuAlertController = UIAlertController(title: "文件操作", message: "文件或文件夹操作", preferredStyle: .actionSheet)
  226. let fileUploadAlert = UIAlertAction(title: "上传文件", style: .destructive) { (fileUploadAction) in
  227. self.uploadFile()
  228. }
  229. let folderCreateAlert = UIAlertAction(title: "创建文件夹", style: .default) { (createFolderAction) in
  230. self.createFolder()
  231. }
  232. let cancelAlert = UIAlertAction(title: "取消", style: .cancel) { (cancelAction) in
  233. }
  234. menuAlertController.addAction(fileUploadAlert)
  235. menuAlertController.addAction(folderCreateAlert)
  236. menuAlertController.addAction(cancelAlert)
  237. self.present(menuAlertController, animated: true, completion: nil)
  238. }
  239. func uploadFile(){
  240. let vc = FileBSImagePickerViewController()
  241. var url = ""
  242. if self.folderQueue.count == 0 {
  243. url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileUploadTopQuery, parameter: nil,coverted: true)!
  244. }else{
  245. url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileUploadSubQuery, parameter: ["##id##":(self.folderQueue.last?.id!)! as AnyObject],coverted: true)!
  246. }
  247. url = url.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed)!
  248. bs_presentImagePickerController(vc, animated: true,
  249. select: { (asset: PHAsset) -> Void in
  250. // User selected an asset.
  251. // Do something with it, start upload perhaps?
  252. }, deselect: { (asset: PHAsset) -> Void in
  253. // User deselected an assets.
  254. // Do something, cancel upload?
  255. }, cancel: { (assets: [PHAsset]) -> Void in
  256. // User cancelled. And this where the assets currently selected.
  257. }, finish: { (assets: [PHAsset]) -> Void in
  258. for asset in assets {
  259. switch asset.mediaType {
  260. case .audio:
  261. DDLogDebug("Audio")
  262. case .image:
  263. let options = PHImageRequestOptions()
  264. options.isSynchronous = true
  265. options.deliveryMode = .fastFormat
  266. options.resizeMode = .none
  267. let headers:HTTPHeaders = ["x-token":(O2AuthSDK.shared.myInfo()?.token!)!]
  268. PHImageManager.default().requestImageData(for: asset, options: options, resultHandler: { (imageData, result, imageOrientation, dict) in
  269. //debugPrint(imageData,result,imageOrientation,dict)
  270. //DDLogDebug("result = \(result) imageOrientation = \(imageOrientation) \(dict)")
  271. let fileURL = dict?["PHImageFileURLKey"] as! URL
  272. let fileSrcName = fileURL.description
  273. let fName = fileSrcName.components(separatedBy: "/").last!
  274. let fExtName = fName.components(separatedBy: ".").last!
  275. let fPreName = fName.components(separatedBy: ".").first!
  276. DispatchQueue.main.async {
  277. self.showMessage(title:"上传中...")
  278. Alamofire.upload(multipartFormData: { (mData) in
  279. let formatter = DateFormatter()
  280. formatter.dateFormat = "yyyyMMddHHmmss"
  281. let str = formatter.string(from: Date())
  282. let fileName = "\(fPreName.lowercased())_\(str).\(fExtName.lowercased())"
  283. mData.append(imageData!, withName: "file", fileName: fileName, mimeType: "image/\(fExtName)")
  284. }, to: url,headers:headers,encodingCompletion: { (encodingResult) in
  285. switch encodingResult {
  286. case .success(let upload,_,_):
  287. debugPrint(upload)
  288. upload.responseJSON { response in
  289. debugPrint(response)
  290. DispatchQueue.main.async {
  291. self.showSuccess(title: "上传成功")
  292. Timer.after(0.8, {
  293. self.tableView.mj_header.beginRefreshing()
  294. })
  295. }
  296. }
  297. case .failure(let errType):
  298. DispatchQueue.main.async {
  299. DDLogError(errType.localizedDescription)
  300. DispatchQueue.main.async {
  301. self.showError(title: "上传失败")
  302. }
  303. }
  304. }
  305. })
  306. }
  307. //// Alamofire.upload(.POST, url, headers:nil, multipartFormData: { (mData) in
  308. ////
  309. //// let formatter = DateFormatter()
  310. //// formatter.dateFormat = "yyyyMMddHHmmss"
  311. //// let str = formatter.string(from: Date())
  312. //// let fileName = "\(fPreName.lowercased())_\(str).\(fExtName.lowercased())"
  313. //// mData.appendBodyPart(data: imageData!, name: "file", fileName: fileName, mimeType: "image/png;*/*")
  314. ////
  315. //// }, encodingMemoryThreshold: SessionManager.MultipartFormDataEncodingMemoryThreshold, encodingCompletion: { (responseResult:SessionManager.MultipartFormDataEncodingResult) in
  316. //// switch responseResult {
  317. //// case .success:
  318. //// //self.loadDataByTabIndex(tabIndex: 0)
  319. //// DispatchQueue.main.async{
  320. //// ProgressHUD.showSuccess("上传成功")
  321. //// }
  322. //// case .failure(let errType):
  323. //// DDLogError(errType)
  324. //// DispatchQueue.main.async{
  325. //// ProgressHUD.showError("上传失败")
  326. //// }
  327. ////
  328. ////
  329. //// }
  330. //// })
  331. })
  332. case .video:
  333. let options = PHVideoRequestOptions()
  334. options.deliveryMode = .fastFormat
  335. options.isNetworkAccessAllowed = true
  336. options.progressHandler = { (progress,err, stop,dict) in
  337. DDLogDebug("progress = \(progress) dict = \(dict)")
  338. }
  339. PHImageManager.default().requestAVAsset(forVideo: asset, options: options, resultHandler: { (avAsset, avAudioMx, dict) in
  340. })
  341. case .unknown:
  342. DDLogDebug("Unknown")
  343. }
  344. }
  345. }, completion: nil)
  346. }
  347. func createFolder(){
  348. let createAlertController = UIAlertController(title: "创建文件夹", message: "", preferredStyle: .alert)
  349. let okAction = UIAlertAction(title: "确定", style: .destructive) { ok in
  350. DDLogDebug("ok Click")
  351. let textInputField = createAlertController.textFields![0]
  352. if let text = textInputField.text {
  353. let url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileFolderCreateQuery, parameter: nil)
  354. let s = self.folderQueue.count == 0 ? "":self.folderQueue.last?.id!
  355. let parameter = ["name":text,"superior":s!]
  356. Alamofire.request(url!, method:.post, parameters: parameter, encoding: JSONEncoding.default, headers: nil).responseJSON(completionHandler: { (response) in
  357. switch response.result {
  358. case .success(let val):
  359. let json = JSON(val)
  360. if json["type"] == "success" {
  361. DispatchQueue.main.async {
  362. self.showSuccess(title: "创建成功")
  363. Timer.after(0.5, {
  364. self.tableView.mj_header.beginRefreshing()
  365. })
  366. }
  367. }else{
  368. DispatchQueue.main.async {
  369. DDLogError(json.description)
  370. self.showError(title: "创建失败")
  371. }
  372. }
  373. case .failure(let err):
  374. DispatchQueue.main.async {
  375. DDLogError(err.localizedDescription)
  376. self.showError(title: "创建失败")
  377. }
  378. }
  379. })
  380. // Alamofire.request(.POST, url!, parameters: parameter, encoding: .json, headers: nil).responseJSON(completionHandler: { (response) in
  381. // switch response.result {
  382. // case .success(let val):
  383. // let json = JSON(val)
  384. // if json["type"] == "success" {
  385. // ProgressHUD.showSuccess("创建成功")
  386. // }else{
  387. // DDLogError(json)
  388. // ProgressHUD.showError("创建失败")
  389. // }
  390. // case .failure(let err):
  391. // ProgressHUD.showError("创建失败")
  392. // DDLogError(err.localizedDescription)
  393. // }
  394. // })
  395. }
  396. }
  397. let cancelAction = UIAlertAction(title: "取消", style: .cancel) { (cancel) in
  398. DDLogDebug("cancel Click")
  399. }
  400. createAlertController.addTextField { (folderInputTextField) in
  401. }
  402. createAlertController.addAction(okAction)
  403. createAlertController.addAction(cancelAction)
  404. self.present(createAlertController, animated: true, completion: nil)
  405. }
  406. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  407. if segue.identifier == "showSharePersonSegue" {
  408. // TODO: 这里需要修改,----后续。
  409. // let navVC = segue.destination as! ZLNavigationController
  410. // let destVC = navVC.topViewController as! MeetingPersonListViewController
  411. // destVC.delegate = self
  412. // destVC.selectPersons = self.sharedPersons
  413. }else if segue.identifier == "showSelectFolderSegue"{
  414. let navVC = segue.destination as! ZLNavigationController
  415. let destVC = navVC.topViewController as! FileFolderSelectViewController
  416. destVC.delegate = self
  417. }else if segue.identifier == "showMyShareSegue" {
  418. // let navVC = segue.destinationViewController as! ZLNavigationController
  419. // let destVC = navVC.topViewController as! FileMyShareListViewController
  420. let destVC = segue.destination as! FileMyShareListViewController
  421. destVC.myFileURL = sender as? String
  422. }
  423. }
  424. }
  425. //extension MainFileViewController:MeetingPersonListPassValue {
  426. // func selectPersonPassValue(_ persons: [PersonV2]) {
  427. // self.sharedPersons.removeAll()
  428. // self.sharedPersons.append(contentsOf: persons)
  429. // self.fileShareAction()
  430. // }
  431. //}
  432. extension MainFileViewController: SegmentedControlDelegate {
  433. func segmentedControl(_ segmentedControl: SegmentedControl, didSelectIndex selectedIndex: Int) {
  434. print("Did select index \(selectedIndex)")
  435. tabIndex = selectedIndex
  436. self.loadDataByTabIndex(tabIndex: tabIndex)
  437. switch segmentedControl.style {
  438. case .text:
  439. print("The title is “\(segmentedControl.titles[selectedIndex].string)”\n")
  440. case .image:
  441. print("The image is “\(segmentedControl.images[selectedIndex])”\n")
  442. }
  443. }
  444. func segmentedControl(_ segmentedControl: SegmentedControl, didLongPressIndex longPressIndex: Int) {
  445. print("Did long press index \(longPressIndex)")
  446. if UIDevice.current.userInterfaceIdiom == .pad {
  447. let viewController = UIViewController()
  448. viewController.modalPresentationStyle = .popover
  449. viewController.preferredContentSize = CGSize(width: 200, height: 300)
  450. if let popoverController = viewController.popoverPresentationController {
  451. popoverController.sourceView = view
  452. let yOffset: CGFloat = 10
  453. popoverController.sourceRect = view.convert(CGRect(origin: CGPoint(x: 70 * CGFloat(longPressIndex), y: yOffset), size: CGSize(width: 70, height: 30)), from: navigationItem.titleView)
  454. popoverController.permittedArrowDirections = .any
  455. present(viewController, animated: true, completion: nil)
  456. }
  457. } else {
  458. let message = segmentedControl.style == .text ? "Long press title “\(segmentedControl.titles[longPressIndex].string)”" : "Long press image “\(segmentedControl.images[longPressIndex])”"
  459. let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet)
  460. let cancelAction = UIAlertAction(title: "OK", style: .cancel, handler: nil)
  461. alert.addAction(cancelAction)
  462. present(alert, animated: true, completion: nil)
  463. }
  464. }
  465. }
  466. extension MainFileViewController:UITableViewDelegate,UITableViewDataSource{
  467. func numberOfSections(in tableView: UITableView) -> Int {
  468. // switch tabIndex {
  469. // case 0:
  470. // return 1
  471. // case 1:
  472. // return self.myFileShare.count > 0 ? self.myFileShare.count : 1
  473. // case 2:
  474. // return self.myFileRecive.count > 0 ? self.myFileRecive.count : 1
  475. // default:
  476. // return 1
  477. // }
  478. return 1
  479. }
  480. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  481. switch tabIndex {
  482. case 0:
  483. return self.myFiles.count
  484. case 1:
  485. return self.myFileShare.count
  486. case 2:
  487. return self.myFileRecive.count
  488. default:
  489. return 0
  490. }
  491. }
  492. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  493. //按不同类型生成相应的cell
  494. switch tabIndex {
  495. case 0:
  496. let file = self.myFiles[(indexPath as NSIndexPath).row]
  497. let cell = tableView.dequeueReusableCell(withIdentifier: "FileTableViewCell", for: indexPath) as! FileTableViewCell
  498. cell.delegate = self
  499. cell.file = file
  500. return cell
  501. case 1:
  502. let fileShare = self.myFileShare[(indexPath as NSIndexPath).row]
  503. let cell = tableView.dequeueReusableCell(withIdentifier: "FileShareTableViewCell",for: indexPath) as! FileShareTableViewCell
  504. cell.fileShare = fileShare
  505. return cell
  506. case 2:
  507. let fileRecive = self.myFileRecive[(indexPath as NSIndexPath).row]
  508. let cell = tableView.dequeueReusableCell(withIdentifier: "FileShareTableViewCell", for: indexPath) as! FileShareTableViewCell
  509. cell.fileShare = fileRecive
  510. return cell
  511. default:
  512. return UITableViewCell()
  513. }
  514. }
  515. func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
  516. if tabIndex == 0 {
  517. return 40.0
  518. }else{
  519. return 0.0
  520. }
  521. }
  522. func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
  523. if tabIndex == 0 {
  524. let headerView = FolderHeaderView()
  525. headerView.frame = CGRect(x: 0, y: 0, width: SCREEN_WIDTH, height: 40)
  526. headerView.folderQueue = self.folderQueue
  527. headerView.delegate = self
  528. return headerView
  529. }else{
  530. return UIView()
  531. }
  532. }
  533. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  534. DDLogDebug("cell clicked row = \(indexPath.row)")
  535. if tabIndex == 0 {
  536. //我的文件
  537. let f = self.myFiles[indexPath.row]
  538. if f.fileType == .folder {
  539. //文件夹显示文件夹内容
  540. self.folderQueue.append(f)
  541. //读取
  542. let url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileFolderItemIdQuery, parameter: ["##id##":f.id! as AnyObject])
  543. self.loadDataRequestFileCompleted(url!)
  544. }else{
  545. self.filePreview(f)
  546. }
  547. }else if tabIndex == 1 {
  548. //共享文件
  549. let fileShare = self.myFileShare[(indexPath as NSIndexPath).row]
  550. //读取共享文件列表
  551. let url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileMyShareListQuery, parameter: ["##name##":fileShare.name! as AnyObject])
  552. self.performSegue(withIdentifier: "showMyShareSegue", sender: url)
  553. }else if tabIndex == 2 {
  554. let fileRecive = self.myFileRecive[(indexPath as NSIndexPath).row]
  555. //接收的文件
  556. let url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileMyEditorListQuery, parameter: ["##name##":fileRecive.name! as AnyObject])
  557. self.performSegue(withIdentifier: "showMyShareSegue", sender: url)
  558. }
  559. }
  560. func filePreview(_ f:OOFile){
  561. //文件就打开
  562. let fileURL = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileDownloadItemIdQuery, parameter: ["##id##":f.id! as AnyObject])
  563. //缓存到本地
  564. var fileLocalURL:URL?
  565. let destination:DownloadRequest.DownloadFileDestination = { temporaryURL, response in
  566. let baseURL = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)[0]
  567. let folder = URL(fileURLWithPath:baseURL).appendingPathComponent("tmpFile", isDirectory: true)
  568. //判断文件夹是否存在,不存在则创建
  569. let exist = FileManager.default.fileExists(atPath: folder.path)
  570. if !exist {
  571. try! FileManager.default.createDirectory(at: folder, withIntermediateDirectories: true,
  572. attributes: nil)
  573. }
  574. //增加随机数
  575. let preName = f.name?.components(separatedBy: ".").first!
  576. let extName = f.name?.components(separatedBy: ".").last!
  577. let timestamp = Date().timeIntervalSince1970.description
  578. fileLocalURL = folder.appendingPathComponent("\(preName!)_\(timestamp).\(extName!)")
  579. return (fileLocalURL!,[.removePreviousFile, .createIntermediateDirectories])
  580. }
  581. self.showMessage(title: "下载中...")
  582. Alamofire.download(fileURL!,to: destination).downloadProgress(closure: { (progress) in
  583. print("progress.fractionCompleted = \(progress.fractionCompleted)")
  584. if progress.completedUnitCount == progress.totalUnitCount {
  585. DispatchQueue.main.async {
  586. self.dismissProgressHUD()
  587. }
  588. }
  589. }).responseData { resp in
  590. switch resp.result {
  591. case .success(_):
  592. DispatchQueue.main.async {
  593. self.dismissProgressHUD()
  594. }
  595. self.fileURLs.removeAll(keepingCapacity: true)
  596. if QLPreviewController.canPreview(fileLocalURL! as QLPreviewItem){
  597. self.fileURLs.append(fileLocalURL!)
  598. self.quickLookController.reloadData()
  599. self.quickLookController.currentPreviewItemIndex = 0
  600. self.navigationController?.pushViewController(self.quickLookController, animated: true)
  601. }
  602. case .failure(let err):
  603. DDLogError(err.localizedDescription)
  604. }
  605. }
  606. // .response { (request, response, data, error) in
  607. // if let err = error {
  608. // DDLogError(err.localizedDescription)
  609. // }else{
  610. // ProgressHUD.dismiss()
  611. // self.fileURLs.removeAll()
  612. // if QLPreviewController.canPreview(fileLocalURL!){
  613. // self.fileURLs.append(fileLocalURL!)
  614. // self.quickLookController.reloadData()
  615. // self.quickLookController.currentPreviewItemIndex = 0
  616. // self.navigationController?.pushViewController(self.quickLookController, animated: true)
  617. // }
  618. // }
  619. // }
  620. }
  621. override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
  622. DDLogDebug("touch")
  623. for touch in touches {
  624. DDLogDebug("touch view = \(touch.view)")
  625. }
  626. }
  627. }
  628. private let FileMenu = ["重命名","删除","移动","下载","分享"]
  629. private let FileFolderMenu = ["重命名","删除","移动"]
  630. private let FileMenuColor = [UIColor.white,
  631. UIColor.purple,
  632. UIColor.cyan,
  633. UIColor.yellow,
  634. UIColor.green]
  635. private let FileFolderMenuColor = [UIColor.white,
  636. UIColor.purple,
  637. UIColor.cyan]
  638. extension MainFileViewController:FileTableViewCellDelegate{
  639. func cellDidClicked(_ cell: FileTableViewCell, file: OOFile) {
  640. DDLogDebug("tableView contentOffset = \(self.tableView.contentOffset)")
  641. DDLogDebug("file clicked id = \(file.id!)")
  642. let startX = SCREEN_WIDTH - 10
  643. //let startY = self.tableView.contentOffset.y > 0 ? cell.center.y - self.tableView.contentOffset.y : cell.center.y
  644. let startY = cell.center.y - self.tableView.contentOffset.y
  645. DDLogDebug("startx = \(startX),starty = \(startY)")
  646. let startPoint = CGPoint(x: startX, y: startY)
  647. if file.fileType == .folder {
  648. //显示文件夹上下文菜单
  649. AZPopMenu.show(self.view, startPoint: startPoint, items: FileFolderMenu, colors: FileFolderMenuColor, selected: { (itemSelected) in
  650. DDLogDebug("\(itemSelected)")
  651. switch itemSelected {
  652. case 0:
  653. self.fileRename(file)
  654. case 1:
  655. self.fileDelete(file)
  656. case 2:
  657. self.fileMove(file)
  658. default:
  659. DDLogDebug("no action")
  660. }
  661. })
  662. }else if file.fileType == .file {
  663. //显示文件上下文菜单
  664. AZPopMenu.show(self.view, startPoint: startPoint, items: FileMenu, colors: FileMenuColor, selected: { (itemSelected) in
  665. DDLogDebug("\(itemSelected)")
  666. switch itemSelected {
  667. case 0:
  668. self.fileRename(file)
  669. case 1:
  670. self.fileDelete(file)
  671. case 2:
  672. self.fileMove(file)
  673. case 3:
  674. self.fileDownload(file)
  675. case 4:
  676. self.fileShare(file)
  677. default:
  678. DDLogDebug("no action")
  679. }
  680. })
  681. }
  682. }
  683. fileprivate func renameFileAction(sourceFile f:OOFile,newFileName name:String){
  684. var url = ""
  685. var parameter:Dictionary<String,String> = [:]
  686. if f.fileType == .file {
  687. url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileRenameQuery, parameter: ["##id##":f.id! as AnyObject])!
  688. parameter["name"] = name
  689. parameter["folder"] = f.folder!
  690. }else if f.fileType == .folder {
  691. url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileFolderActionIdQuery,parameter: ["##id##":f.id! as AnyObject])!
  692. parameter["name"] = name
  693. parameter["superior"] = f.superior!
  694. }
  695. self.showMessage(title: "更新中")
  696. Alamofire.request(url, method: .put, parameters: parameter, encoding: JSONEncoding.default, headers: nil).responseJSON { (response) in
  697. switch response.result {
  698. case .success(let val):
  699. let json = JSON(val)
  700. if json["type"] == "success" {
  701. self.myFiles.forEachEnumerated({ (index, file) in
  702. if file.id == f.id {
  703. file.name = name
  704. }
  705. })
  706. DispatchQueue.main.async {
  707. self.tableView.reloadData()
  708. self.showSuccess(title: "重命名完成")
  709. }
  710. }else{
  711. }
  712. case .failure(let err):
  713. DispatchQueue.main.async {
  714. DDLogError(err.localizedDescription)
  715. self.showError(title: "重命名失败")
  716. }
  717. }
  718. }
  719. }
  720. //重命名
  721. func fileRename(_ f:OOFile){
  722. let renameViewController = UIAlertController(title: "重命名", message: "原名称:\(f.name!)", preferredStyle: .alert)
  723. let okAction = UIAlertAction(title: "确定", style: .destructive) { (okAction) in
  724. let textField = renameViewController.textFields![0]
  725. if let text = textField.text {
  726. if text.isEmpty {
  727. DDLogDebug("empty name = \(text)")
  728. }else{
  729. DDLogDebug("new name = \(text)")
  730. self.renameFileAction(sourceFile: f, newFileName: text)
  731. }
  732. }
  733. }
  734. let cancelAction = UIAlertAction(title: "取消", style: .cancel) { (cancelAction) in
  735. }
  736. renameViewController.addTextField { (textField) in
  737. textField.placeholder = "请输入新名称"
  738. textField.textColor = UIColor.red
  739. }
  740. renameViewController.addAction(okAction)
  741. renameViewController.addAction(cancelAction)
  742. self.present(renameViewController, animated: true, completion: nil)
  743. }
  744. fileprivate func deleteFileAction(_ f:OOFile){
  745. var url = ""
  746. if f.fileType == .file {
  747. url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileDeleteQuery, parameter: ["##id##":f.id! as AnyObject])!
  748. }else if f.fileType == .folder {
  749. url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileFolderActionIdQuery, parameter: ["##id##":f.id! as AnyObject])!
  750. }
  751. self.showMessage(title: "删除中")
  752. Alamofire.request(url,method:.delete, parameters: nil, encoding: JSONEncoding.default, headers: nil).responseJSON { (response) in
  753. switch response.result {
  754. case .success(let val):
  755. let json = JSON(val)
  756. if json["type"] == "success" {
  757. self.myFiles.remove(at: self.myFiles.index(where: { (file) -> Bool in
  758. if f.id == file.id {
  759. return true
  760. }else{
  761. return false
  762. }
  763. })!)
  764. DispatchQueue.main.async {
  765. self.tableView.reloadData()
  766. self.showSuccess(title: "删除成功")
  767. }
  768. }else{
  769. DispatchQueue.main.async {
  770. DDLogError("删除失败:\(json)")
  771. self.showError(title: "删除失败")
  772. }
  773. }
  774. case .failure(let err):
  775. DispatchQueue.main.async {
  776. DDLogError("删除失败:\(err)")
  777. self.showError(title: "删除失败")
  778. }
  779. }
  780. }
  781. }
  782. //删除
  783. func fileDelete(_ f:OOFile){
  784. let deleViewController = UIAlertController(title: "删除", message: "删除文件:\(f.name!)", preferredStyle: .alert)
  785. let okAction = UIAlertAction(title: "确定", style: .destructive) { (okAction) in
  786. //执行删除
  787. self.deleteFileAction(f)
  788. }
  789. let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)
  790. deleViewController.addAction(okAction)
  791. deleViewController.addAction(cancelAction)
  792. self.present(deleViewController,animated: true,completion: nil)
  793. }
  794. func fileMoveAction(){
  795. //移动
  796. var url = ""
  797. var parameter:[String:AnyObject] = [:]
  798. if moveSourceFile?.fileType == .file {
  799. url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileRenameQuery, parameter: ["##id##":(moveSourceFile?.id)! as AnyObject])!
  800. parameter["name"] = moveSourceFile?.name as AnyObject?
  801. parameter["folder"] = moveTargeFolder?.id as AnyObject?
  802. }else if moveSourceFile?.fileType == .folder {
  803. url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileFolderActionIdQuery, parameter: ["##id##":(moveSourceFile?.id)! as AnyObject])!
  804. parameter["name"] = moveSourceFile?.name as AnyObject?
  805. parameter["superior"] = moveTargeFolder?.id as AnyObject?
  806. }
  807. Alamofire.request(url,method:.put, parameters: parameter, encoding: JSONEncoding.default , headers: nil).responseJSON { (response) in
  808. switch response.result {
  809. case .success(let val):
  810. let json = JSON(val)
  811. if json["type"] == "success" {
  812. self.myFiles.remove(at: self.myFiles.index(where: { (file) -> Bool in
  813. if self.moveSourceFile?.id == file.id {
  814. return true
  815. }else{
  816. return false
  817. }
  818. })!)
  819. DispatchQueue.main.async {
  820. self.tableView.reloadData()
  821. self.showSuccess(title: "移动完成")
  822. }
  823. }else{
  824. DispatchQueue.main.async {
  825. DDLogError(json.description)
  826. self.showError(title: "移动失败")
  827. }
  828. }
  829. case .failure(let err):
  830. DispatchQueue.main.async {
  831. DDLogError(err.localizedDescription)
  832. self.showError(title: "移动失败")
  833. }
  834. }
  835. }
  836. }
  837. //移动
  838. func fileMove(_ f:OOFile){
  839. self.moveSourceFile = f
  840. self.performSegue(withIdentifier: "showSelectFolderSegue", sender: nil)
  841. }
  842. func getRect() -> CGRect {
  843. return CGRect(
  844. x: view.centerX - 100 / 2,
  845. y: view.centerY - 100 / 2 - 33,
  846. width: 100,
  847. height: 100)
  848. }
  849. //下载
  850. func fileDownload(_ f:OOFile){
  851. //存储到私有目录
  852. let url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileDownloadItemIdQuery, parameter: ["##id##":f.id! as AnyObject])
  853. let destination:DownloadRequest.DownloadFileDestination = { temporaryURL, response in
  854. let baseURL = NSSearchPathForDirectoriesInDomains(.downloadsDirectory, .userDomainMask, true)[0]
  855. let folder = URL(fileURLWithPath:baseURL).appendingPathComponent("file", isDirectory: true)
  856. //判断文件夹是否存在,不存在则创建
  857. let exist = FileManager.default.fileExists(atPath: folder.path)
  858. if !exist {
  859. try! FileManager.default.createDirectory(at: folder, withIntermediateDirectories: true,
  860. attributes: nil)
  861. }
  862. return (folder.appendingPathComponent(f.name!), [.removePreviousFile, .createIntermediateDirectories])
  863. }
  864. self.showMessage(title: "下载中...")
  865. let utilityQueue = DispatchQueue.global(qos: .utility)
  866. Alamofire.download(url!, to: destination).downloadProgress(queue: utilityQueue) { (progress) in
  867. print("progress.fractionCompleted = \(progress.fractionCompleted)")
  868. // DispatchQueue.main.async {
  869. // self.showSuccess(title: "<#T##String#>")
  870. // }
  871. //
  872. }.responseData { (resp) in
  873. DispatchQueue.main.async {
  874. self.dismissProgressHUD()
  875. }
  876. switch resp.result {
  877. case .success( _):
  878. DispatchQueue.main.async {
  879. self.showSuccess(title: "下载完成")
  880. }
  881. case .failure(let err):
  882. DispatchQueue.main.async {
  883. DDLogError(err.localizedDescription)
  884. self.showError(title: "下载失败")
  885. }
  886. }
  887. }
  888. }
  889. //分享
  890. func fileShare(_ f:OOFile){
  891. currentSharedFile = f
  892. self.performSegue(withIdentifier: "showSharePersonSegue", sender: nil)
  893. }
  894. func fileShareAction(){
  895. var names:[String] = []
  896. sharedPersons.forEach { (p) in
  897. names.append(p.name!)
  898. }
  899. let url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileShareActionQuery, parameter: ["##id##":(currentSharedFile?.id)! as AnyObject])
  900. self.showMessage(title: "分享中...")
  901. Alamofire.request(url!, method:.put , parameters: ["shareList":names], encoding: JSONEncoding.default, headers: nil).responseJSON { (response) in
  902. switch response.result {
  903. case .success(let val):
  904. let json = JSON(val)
  905. if json["type"] == "success" {
  906. DispatchQueue.main.async {
  907. self.showSuccess(title: "分享成功")
  908. }
  909. }else{
  910. DispatchQueue.main.async {
  911. self.showError(title: "分享失败")
  912. }
  913. }
  914. case .failure(let err):
  915. DispatchQueue.main.async {
  916. DDLogError(err.localizedDescription)
  917. self.showError(title: "分享失败")
  918. }
  919. }
  920. }
  921. }
  922. }
  923. extension MainFileViewController:FileFolderPassValueDelegate{
  924. func selectedFolder(_ f: OOFile) {
  925. self.moveTargeFolder = f
  926. self.fileMoveAction()
  927. }
  928. }
  929. extension MainFileViewController:FolderHeaderViewDelegate{
  930. func headerClickSelected(currentFile f: OOFile, folderQueue fQueue: [OOFile]) {
  931. self.folderQueue = fQueue
  932. var url = ""
  933. if f.id == "0" {
  934. url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileTopListQuery, parameter: nil)!
  935. }else{
  936. url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileFolderItemIdQuery, parameter: ["##id##":f.id! as AnyObject])!
  937. }
  938. self.loadDataRequestFileCompleted(url)
  939. }
  940. }
  941. //quick look
  942. extension MainFileViewController:QLPreviewControllerDataSource,QLPreviewControllerDelegate{
  943. func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
  944. return fileURLs.count
  945. }
  946. func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
  947. return fileURLs[index] as QLPreviewItem
  948. }
  949. }