1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078 |
- //
- // MainFileViewController.swift
- // O2Platform
- //
- // Created by 刘振兴 on 16/8/17.
- // Copyright © 2016年 zoneland. All rights reserved.
- //
- import UIKit
- import Alamofire
- import AlamofireImage
- import AlamofireObjectMapper
- import SwiftyJSON
- import ObjectMapper
- import BSImagePicker
- import Photos
- import QuickLook
- import CocoaLumberjack
- private let kLivelyRedColor = base_color
- class MainFileViewController: UIViewController {
-
- @IBOutlet weak var tableView: ZLBaseTableView!
-
- var myFiles:[OOFile] = []
-
- var myFileShare:[FileShare] = []
-
- var myFileRecive:[FileShare] = []
-
- //移动选择的文件夹
- var moveSourceFile:OOFile?
-
- var moveTargeFolder:OOFile?
-
- //分享的人员列表
- var sharedPersons:[PersonV2] = []
-
- //分享的文件
- var currentSharedFile:OOFile?
-
- //文件夹深度队列
- var folderQueue:[OOFile] = []
-
- var segmentedControl:SegmentedControl?{
- didSet {
- tabIndex = (segmentedControl?.selectedIndex)!
- }
- }
-
- var tabIndex:Int = 0
-
- //预览
- let quickLookController = QLPreviewController()
-
- var fileURLs = [URL]()
-
-
-
- override func viewDidLoad() {
- super.viewDidLoad()
- //self.tableView.registerClass(Class() , forCellReuseIdentifier: "FileShareTableViewCell")
- setupUI()
- self.tableView.contentInset = UIEdgeInsets(top: 40.0, left: 0, bottom: 0, right: 0)
- self.tableView.delegate = self
- self.tableView.dataSource = self
- self.tableView.mj_header = MJRefreshNormalHeader(refreshingBlock: {
- self.loadDataByTabIndex(tabIndex: self.tabIndex)
- })
- self.loadDataByTabIndex(tabIndex:tabIndex)
-
- quickLookController.dataSource = self
- quickLookController.delegate = self
- }
-
- func loadDataRequestFileCompleted(_ url:String){
- self.showLoading(title: "加载中")
- AF.request(url).responseJSON { response in
- self.myFiles.removeAll()
- switch response.result {
- case .success(let val):
- let type = JSON(val)["type"]
- if type == "success" {
- let json = JSON(val)["data"]
- let files = Mapper<OOFile>().mapArray(JSONString:json["attachmentList"].description)
- let folders = Mapper<OOFile>().mapArray(JSONString:json["folderList"].description)
- DispatchQueue.main.async {
- self.myFiles.append(contentsOf: files!)
- self.myFiles.append(contentsOf: folders!)
- self.tableView.reloadData()
- self.showSuccess(title: "加载完成")
- }
- }else{
- DispatchQueue.main.async {
- DDLogError(JSON(val).description)
- self.tableView.reloadData()
- self.showError(title: "加载失败")
- }
-
- }
- case .failure(let err):
- DispatchQueue.main.async {
- DDLogError(err.localizedDescription)
- self.tableView.reloadData()
- self.showError(title: "加载失败")
- }
-
- }
- DispatchQueue.main.async {
- if self.tableView.mj_header.isRefreshing(){
- self.tableView.mj_header.endRefreshing()
- }
- }
-
- }
-
- }
-
- func loadDataRequestFileShareCompleted(_ url:String){
- self.showLoading(title: "加载中")
- AF.request(url).responseArray( keyPath: "data", context: nil)
- { (response:AFDataResponse<[FileShare]>) in
- self.myFileShare.removeAll()
- debugPrint(response.result)
- switch response.result {
- case .success(let shares):
- DispatchQueue.main.async {
- self.myFileShare.append(contentsOf: shares)
- self.tableView.reloadData()
- self.showSuccess(title: "加载完成")
- }
- case .failure(let err):
- DispatchQueue.main.async {
- DDLogError(err.localizedDescription)
- self.tableView.reloadData()
- self.showError(title: "加载失败")
- }
- }
- DispatchQueue.main.async {
- if self.tableView.mj_header.isRefreshing(){
- self.tableView.mj_header.endRefreshing()
- }
- }
- }
- }
-
- func loadDataRequestFileReciveCompleted(_ url:String) {
- self.showLoading(title: "加载中")
- AF.request(url).responseArray(keyPath: "data", context: nil) {
- (response:AFDataResponse<[FileShare]>) in
- self.myFileRecive.removeAll()
- switch response.result {
- case .success(let shares):
- DispatchQueue.main.async {
- self.myFileRecive.append(contentsOf: shares)
- self.tableView.reloadData()
- self.showSuccess(title: "加载完成")
- }
-
- case .failure(let err):
- DispatchQueue.main.async {
- DDLogError(err.localizedDescription)
- self.tableView.reloadData()
- self.showError(title: "加载失败")
- }
- }
- DispatchQueue.main.async {
- if self.tableView.mj_header.isRefreshing(){
- self.tableView.mj_header.endRefreshing()
- }
- }
-
- }
- }
-
-
-
- func loadDataByTabIndex(tabIndex index:Int){
- //计算URL
- var url = ""
- switch index {
- case 0:
- self.tableView.emptyTitle = "没有文件数据"
- if self.folderQueue.count <= 0 {
- url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileTopListQuery, parameter: nil)!
- self.loadDataRequestFileCompleted(url)
- }else{
- let f = self.folderQueue.last
- //读取
- let url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileFolderItemIdQuery, parameter: ["##id##":f!.id! as AnyObject])
- self.loadDataRequestFileCompleted(url!)
- }
- case 1:
- self.tableView.emptyTitle = "没有收到共享的文件"
- url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileShareQuery, parameter: nil)!
- self.loadDataRequestFileShareCompleted(url)
- case 2:
- self.tableView.emptyTitle = "没有共享文件给其它人"
- url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileEditorQuery, parameter: nil)!
- self.loadDataRequestFileReciveCompleted(url)
- default:
- url = ""
- }
-
-
- }
-
- func setupUI(){
- self.initSegmentedControl()
- }
-
- func initSegmentedControl(){
- let titleStrings = ["我的文件","共享文件","收到文件"]
- let titles: [NSAttributedString] = {
- let attributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 16), NSAttributedString.Key.foregroundColor: UIColor.black]
- var titles = [NSAttributedString]()
- for titleString in titleStrings {
- let title = NSAttributedString(string: titleString, attributes: attributes)
- titles.append(title)
- }
- return titles
- }()
- let selectedTitles: [NSAttributedString] = {
- let attributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 16), NSAttributedString.Key.foregroundColor: kLivelyRedColor]
- var selectedTitles = [NSAttributedString]()
- for titleString in titleStrings {
- let selectedTitle = NSAttributedString(string: titleString, attributes: attributes)
- selectedTitles.append(selectedTitle)
- }
- return selectedTitles
- }()
- self.segmentedControl = SegmentedControl.initWithTitles(titles, selectedTitles: selectedTitles)
- self.segmentedControl!.delegate = self
- self.segmentedControl!.backgroundColor = toolbar_background_color
- self.segmentedControl!.autoresizingMask = [.flexibleRightMargin, .flexibleWidth]
- self.segmentedControl!.selectionIndicatorStyle = .bottom
- self.segmentedControl!.selectionIndicatorColor = kLivelyRedColor
- self.segmentedControl!.selectionIndicatorHeight = 3
- self.segmentedControl!.segmentWidth = SCREEN_WIDTH / 3
- self.segmentedControl!.frame.origin.y = 0
- self.segmentedControl!.frame.size = CGSize(width: UIScreen.main.bounds.width, height: 40)
- view.insertSubview(self.segmentedControl!, belowSubview: navigationController!.navigationBar)
- }
-
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- }
-
-
- @IBAction func showMyFile(_ sender: UIBarButtonItem) {
-
- self.performSegue(withIdentifier: "showMyDownloadSegue", sender: nil)
- }
-
-
-
- @IBAction func backToHome(_ sender: UIBarButtonItem) {
- let backType = AppConfigSettings.shared.appBackType
- if backType == 1 {
- self.performSegue(withIdentifier: "backToMain", sender: nil)
- }else if backType == 2 {
- self.performSegue(withIdentifier: "backToApps", sender: nil)
- }
- }
-
- @IBAction func uploadFileMenu(_ sender: UIBarButtonItem) {
- let menuAlertController = UIAlertController(title: "文件操作", message: "文件或文件夹操作", preferredStyle: .actionSheet)
- let fileUploadAlert = UIAlertAction(title: "上传文件", style: .destructive) { (fileUploadAction) in
- self.uploadFile()
- }
- let folderCreateAlert = UIAlertAction(title: "创建文件夹", style: .default) { (createFolderAction) in
- self.createFolder()
- }
- let cancelAlert = UIAlertAction(title: "取消", style: .cancel) { (cancelAction) in
-
- }
- menuAlertController.addAction(fileUploadAlert)
- menuAlertController.addAction(folderCreateAlert)
- menuAlertController.addAction(cancelAlert)
- self.present(menuAlertController, animated: true, completion: nil)
- }
-
- func uploadFile(){
- var url = ""
- if self.folderQueue.count == 0 {
- url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileUploadTopQuery, parameter: nil,coverted: true)!
- }else{
- url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileUploadSubQuery, parameter: ["##id##":(self.folderQueue.last?.id!)! as AnyObject],coverted: true)!
- }
- url = url.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed)!
- let vc = FileBSImagePickerViewController().bsImagePicker()
- presentImagePicker(vc, select: { (asset: PHAsset) -> Void in
- // User selected an asset.
- // Do something with it, start upload perhaps?
- }, deselect: { (asset: PHAsset) -> Void in
- // User deselected an assets.
- // Do something, cancel upload?
- }, cancel: { (assets: [PHAsset]) -> Void in
- // User cancelled. And this where the assets currently selected.
- }, finish: { (assets: [PHAsset]) -> Void in
- for asset in assets {
- switch asset.mediaType {
- case .audio:
- DDLogDebug("Audio")
- case .image:
- let options = PHImageRequestOptions()
- options.isSynchronous = true
- options.deliveryMode = .fastFormat
- options.resizeMode = .none
- // let headers:HTTPHeaders = ["x-token":(O2AuthSDK.shared.myInfo()?.token!)!]
- //获取文件名
- let fName = (asset.value(forKey: "filename") as? String) ?? "untitle.png"
- PHImageManager.default().requestImageData(for: asset, options: options, resultHandler: { (imageData, result, imageOrientation, dict) in
- //debugPrint(imageData,result,imageOrientation,dict)
- //DDLogDebug("result = \(result) imageOrientation = \(imageOrientation) \(dict)")
- // let fileURL = dict?["PHImageFileURLKey"] as! URL
- // let fileSrcName = fileURL.description
- // let fName = fileSrcName.components(separatedBy: "/").last!
- let fExtName = fName.components(separatedBy: ".").last!
- let fPreName = fName.components(separatedBy: ".").first!
- DispatchQueue.main.async {
- self.showLoading(title:"上传中...")
- AF.upload(multipartFormData: { (mData) in
- let formatter = DateFormatter()
- formatter.dateFormat = "yyyyMMddHHmmss"
- let str = formatter.string(from: Date())
- let fileName = "\(fPreName.lowercased())_\(str).\(fExtName.lowercased())"
- mData.append(imageData!, withName: "file", fileName: fileName, mimeType: "image/\(fExtName)")
- }, to: url).responseJSON { (response) in
- print(response)
- if let err = response.error {
- DispatchQueue.main.async {
- DDLogError(err.localizedDescription)
- DispatchQueue.main.async {
- self.showError(title: "上传失败")
- }
- }
- }else {
- DispatchQueue.main.async {
- self.showSuccess(title: "上传成功")
- Timer.after(0.8, {
- self.tableView.mj_header.beginRefreshing()
- })
- }
- }
- }
- // AF.upload(multipartFormData: { (mData) in
- // let formatter = DateFormatter()
- // formatter.dateFormat = "yyyyMMddHHmmss"
- // let str = formatter.string(from: Date())
- // let fileName = "\(fPreName.lowercased())_\(str).\(fExtName.lowercased())"
- // mData.append(imageData!, withName: "file", fileName: fileName, mimeType: "image/\(fExtName)")
- // }, to: url,headers:headers,encodingCompletion: { (encodingResult) in
- // switch encodingResult {
- // case .success(let upload,_,_):
- // debugPrint(upload)
- // upload.responseJSON { response in
- // debugPrint(response)
- // DispatchQueue.main.async {
- // self.showSuccess(title: "上传成功")
- // Timer.after(0.8, {
- // self.tableView.mj_header.beginRefreshing()
- // })
- //
- // }
- // }
- // case .failure(let errType):
- // DispatchQueue.main.async {
- // DDLogError(errType.localizedDescription)
- // DispatchQueue.main.async {
- // self.showError(title: "上传失败")
- // }
- // }
- // }
- //
- // })
- }
-
- })
- case .video:
- let options = PHVideoRequestOptions()
- options.deliveryMode = .fastFormat
- options.isNetworkAccessAllowed = true
- options.progressHandler = { (progress,err, stop,dict) in
- DDLogDebug("progress = \(progress) dict = \(dict)")
- }
- PHImageManager.default().requestAVAsset(forVideo: asset, options: options, resultHandler: { (avAsset, avAudioMx, dict) in
-
- })
- case .unknown:
- DDLogDebug("Unknown")
-
- }
- }
- }, completion: nil)
- }
-
- func createFolder(){
- let createAlertController = UIAlertController(title: "创建文件夹", message: "", preferredStyle: .alert)
- let okAction = UIAlertAction(title: "确定", style: .destructive) { ok in
- DDLogDebug("ok Click")
- let textInputField = createAlertController.textFields![0]
- if let text = textInputField.text {
- let url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileFolderCreateQuery, parameter: nil)
- let s = self.folderQueue.count == 0 ? "":self.folderQueue.last?.id!
- let parameter = ["name":text,"superior":s!]
- AF.request(url!, method:.post, parameters: parameter, encoding: JSONEncoding.default, headers: nil).responseJSON(completionHandler: { (response) in
- switch response.result {
- case .success(let val):
- let json = JSON(val)
- if json["type"] == "success" {
- DispatchQueue.main.async {
- self.showSuccess(title: "创建成功")
- Timer.after(0.5, {
- self.tableView.mj_header.beginRefreshing()
- })
- }
- }else{
- DispatchQueue.main.async {
- DDLogError(json.description)
- self.showError(title: "创建失败")
- }
-
- }
- case .failure(let err):
- DispatchQueue.main.async {
- DDLogError(err.localizedDescription)
- self.showError(title: "创建失败")
- }
- }
-
- })
- // AF.request(.POST, url!, parameters: parameter, encoding: .json, headers: nil).responseJSON(completionHandler: { (response) in
- // switch response.result {
- // case .success(let val):
- // let json = JSON(val)
- // if json["type"] == "success" {
- // ProgressHUD.showSuccess("创建成功")
- // }else{
- // DDLogError(json)
- // ProgressHUD.showError("创建失败")
- // }
- // case .failure(let err):
- // ProgressHUD.showError("创建失败")
- // DDLogError(err.localizedDescription)
- // }
- // })
- }
- }
- let cancelAction = UIAlertAction(title: "取消", style: .cancel) { (cancel) in
- DDLogDebug("cancel Click")
- }
- createAlertController.addTextField { (folderInputTextField) in
-
- }
- createAlertController.addAction(okAction)
- createAlertController.addAction(cancelAction)
- self.present(createAlertController, animated: true, completion: nil)
- }
-
-
-
- override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
- if segue.identifier == "showSharePersonSegue" {
- // TODO: 这里需要修改,----后续。
- // let navVC = segue.destination as! ZLNavigationController
- // let destVC = navVC.topViewController as! MeetingPersonListViewController
- // destVC.delegate = self
- // destVC.selectPersons = self.sharedPersons
- }else if segue.identifier == "showSelectFolderSegue"{
- let navVC = segue.destination as! ZLNavigationController
- let destVC = navVC.topViewController as! FileFolderSelectViewController
- destVC.delegate = self
- }else if segue.identifier == "showMyShareSegue" {
- // let navVC = segue.destinationViewController as! ZLNavigationController
- // let destVC = navVC.topViewController as! FileMyShareListViewController
- let destVC = segue.destination as! FileMyShareListViewController
- destVC.myFileURL = sender as? String
- }
- }
-
-
-
- }
- //extension MainFileViewController:MeetingPersonListPassValue {
- // func selectPersonPassValue(_ persons: [PersonV2]) {
- // self.sharedPersons.removeAll()
- // self.sharedPersons.append(contentsOf: persons)
- // self.fileShareAction()
- // }
- //}
- extension MainFileViewController: SegmentedControlDelegate {
- func segmentedControl(_ segmentedControl: SegmentedControl, didSelectIndex selectedIndex: Int) {
- print("Did select index \(selectedIndex)")
- tabIndex = selectedIndex
- self.loadDataByTabIndex(tabIndex: tabIndex)
- switch segmentedControl.style {
- case .text:
- print("The title is “\(segmentedControl.titles[selectedIndex].string)”\n")
- case .image:
- print("The image is “\(segmentedControl.images[selectedIndex])”\n")
- }
- }
-
- func segmentedControl(_ segmentedControl: SegmentedControl, didLongPressIndex longPressIndex: Int) {
- print("Did long press index \(longPressIndex)")
- if UIDevice.current.userInterfaceIdiom == .pad {
- let viewController = UIViewController()
- viewController.modalPresentationStyle = .popover
- viewController.preferredContentSize = CGSize(width: 200, height: 300)
- if let popoverController = viewController.popoverPresentationController {
- popoverController.sourceView = view
- let yOffset: CGFloat = 10
- popoverController.sourceRect = view.convert(CGRect(origin: CGPoint(x: 70 * CGFloat(longPressIndex), y: yOffset), size: CGSize(width: 70, height: 30)), from: navigationItem.titleView)
- popoverController.permittedArrowDirections = .any
- present(viewController, animated: true, completion: nil)
- }
- } else {
- let message = segmentedControl.style == .text ? "Long press title “\(segmentedControl.titles[longPressIndex].string)”" : "Long press image “\(segmentedControl.images[longPressIndex])”"
- let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet)
- let cancelAction = UIAlertAction(title: "OK", style: .cancel, handler: nil)
- alert.addAction(cancelAction)
- present(alert, animated: true, completion: nil)
- }
- }
- }
- extension MainFileViewController:UITableViewDelegate,UITableViewDataSource{
-
- func numberOfSections(in tableView: UITableView) -> Int {
- // switch tabIndex {
- // case 0:
- // return 1
- // case 1:
- // return self.myFileShare.count > 0 ? self.myFileShare.count : 1
- // case 2:
- // return self.myFileRecive.count > 0 ? self.myFileRecive.count : 1
- // default:
- // return 1
- // }
- return 1
- }
-
- func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
- switch tabIndex {
- case 0:
- return self.myFiles.count
- case 1:
- return self.myFileShare.count
- case 2:
- return self.myFileRecive.count
- default:
- return 0
- }
- }
-
- func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
- //按不同类型生成相应的cell
- switch tabIndex {
- case 0:
- let file = self.myFiles[(indexPath as NSIndexPath).row]
- let cell = tableView.dequeueReusableCell(withIdentifier: "FileTableViewCell", for: indexPath) as! FileTableViewCell
- cell.delegate = self
- cell.file = file
- return cell
- case 1:
- let fileShare = self.myFileShare[(indexPath as NSIndexPath).row]
- let cell = tableView.dequeueReusableCell(withIdentifier: "FileShareTableViewCell",for: indexPath) as! FileShareTableViewCell
- cell.fileShare = fileShare
- return cell
- case 2:
- let fileRecive = self.myFileRecive[(indexPath as NSIndexPath).row]
- let cell = tableView.dequeueReusableCell(withIdentifier: "FileShareTableViewCell", for: indexPath) as! FileShareTableViewCell
- cell.fileShare = fileRecive
- return cell
- default:
- return UITableViewCell()
- }
- }
-
- func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
- if tabIndex == 0 {
- return 40.0
- }else{
- return 0.0
- }
- }
-
- func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
- if tabIndex == 0 {
- let headerView = FolderHeaderView()
- headerView.frame = CGRect(x: 0, y: 0, width: SCREEN_WIDTH, height: 40)
- headerView.folderQueue = self.folderQueue
- headerView.delegate = self
- return headerView
- }else{
- return UIView()
- }
- }
-
-
- func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
- DDLogDebug("cell clicked row = \(indexPath.row)")
- if tabIndex == 0 {
- //我的文件
- let f = self.myFiles[indexPath.row]
- if f.fileType == .folder {
- //文件夹显示文件夹内容
- self.folderQueue.append(f)
- //读取
- let url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileFolderItemIdQuery, parameter: ["##id##":f.id! as AnyObject])
- self.loadDataRequestFileCompleted(url!)
-
- }else{
- self.filePreview(f)
- }
- }else if tabIndex == 1 {
- //共享文件
- let fileShare = self.myFileShare[(indexPath as NSIndexPath).row]
- //读取共享文件列表
- let url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileMyShareListQuery, parameter: ["##name##":fileShare.name! as AnyObject])
- self.performSegue(withIdentifier: "showMyShareSegue", sender: url)
-
- }else if tabIndex == 2 {
- let fileRecive = self.myFileRecive[(indexPath as NSIndexPath).row]
- //接收的文件
- let url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileMyEditorListQuery, parameter: ["##name##":fileRecive.name! as AnyObject])
- self.performSegue(withIdentifier: "showMyShareSegue", sender: url)
- }
- }
-
- func filePreview(_ f:OOFile){
- //文件就打开
- let fileURL = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileDownloadItemIdQuery, parameter: ["##id##":f.id! as AnyObject])
- //缓存到本地
- var fileLocalURL:URL?
-
- let destination:DownloadRequest.Destination = { temporaryURL, response in
- let baseURL = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)[0]
- let folder = URL(fileURLWithPath:baseURL).appendingPathComponent("tmpFile", isDirectory: true)
- //判断文件夹是否存在,不存在则创建
- let exist = FileManager.default.fileExists(atPath: folder.path)
- if !exist {
- try! FileManager.default.createDirectory(at: folder, withIntermediateDirectories: true,
- attributes: nil)
- }
- //增加随机数
- let preName = f.name?.components(separatedBy: ".").first!
- let extName = f.name?.components(separatedBy: ".").last!
- let timestamp = Date().timeIntervalSince1970.description
- fileLocalURL = folder.appendingPathComponent("\(preName!)_\(timestamp).\(extName!)")
- return (fileLocalURL!,[.removePreviousFile, .createIntermediateDirectories])
- }
- self.showLoading(title: "下载中...")
- AF.download(fileURL!,to: destination).downloadProgress(closure: { (progress) in
- print("progress.fractionCompleted = \(progress.fractionCompleted)")
- if progress.completedUnitCount == progress.totalUnitCount {
- DispatchQueue.main.async {
- self.hideLoading()
- }
- }
- }).responseData { resp in
- switch resp.result {
- case .success(_):
- DispatchQueue.main.async {
- self.hideLoading()
- }
- self.fileURLs.removeAll(keepingCapacity: true)
- if QLPreviewController.canPreview(fileLocalURL! as QLPreviewItem){
- self.fileURLs.append(fileLocalURL!)
- self.quickLookController.reloadData()
- self.quickLookController.currentPreviewItemIndex = 0
- self.navigationController?.pushViewController(self.quickLookController, animated: true)
- }
- case .failure(let err):
- DDLogError(err.localizedDescription)
- }
- }
-
-
-
- // .response { (request, response, data, error) in
- // if let err = error {
- // DDLogError(err.localizedDescription)
- // }else{
- // ProgressHUD.dismiss()
- // self.fileURLs.removeAll()
- // if QLPreviewController.canPreview(fileLocalURL!){
- // self.fileURLs.append(fileLocalURL!)
- // self.quickLookController.reloadData()
- // self.quickLookController.currentPreviewItemIndex = 0
- // self.navigationController?.pushViewController(self.quickLookController, animated: true)
- // }
- // }
- // }
-
-
- }
-
- override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
- DDLogDebug("touch")
- for touch in touches {
- DDLogDebug("touch view = \(touch.view)")
- }
- }
-
- }
- private let FileMenu = ["重命名","删除","移动","下载","分享"]
- private let FileFolderMenu = ["重命名","删除","移动"]
- private let FileMenuColor = [UIColor.white,
- UIColor.purple,
- UIColor.cyan,
- UIColor.yellow,
- UIColor.green]
- private let FileFolderMenuColor = [UIColor.white,
- UIColor.purple,
- UIColor.cyan]
- extension MainFileViewController:FileTableViewCellDelegate{
- func cellDidClicked(_ cell: FileTableViewCell, file: OOFile) {
- DDLogDebug("tableView contentOffset = \(self.tableView.contentOffset)")
- DDLogDebug("file clicked id = \(file.id!)")
- let startX = SCREEN_WIDTH - 10
- //let startY = self.tableView.contentOffset.y > 0 ? cell.center.y - self.tableView.contentOffset.y : cell.center.y
- let startY = cell.center.y - self.tableView.contentOffset.y
- DDLogDebug("startx = \(startX),starty = \(startY)")
- let startPoint = CGPoint(x: startX, y: startY)
- if file.fileType == .folder {
- //显示文件夹上下文菜单
- AZPopMenu.show(self.view, startPoint: startPoint, items: FileFolderMenu, colors: FileFolderMenuColor, selected: { (itemSelected) in
- DDLogDebug("\(itemSelected)")
- switch itemSelected {
- case 0:
- self.fileRename(file)
- case 1:
- self.fileDelete(file)
- case 2:
- self.fileMove(file)
- default:
- DDLogDebug("no action")
- }
-
- })
-
- }else if file.fileType == .file {
- //显示文件上下文菜单
- AZPopMenu.show(self.view, startPoint: startPoint, items: FileMenu, colors: FileMenuColor, selected: { (itemSelected) in
- DDLogDebug("\(itemSelected)")
- switch itemSelected {
- case 0:
- self.fileRename(file)
- case 1:
- self.fileDelete(file)
- case 2:
- self.fileMove(file)
- case 3:
- self.fileDownload(file)
- case 4:
- self.fileShare(file)
- default:
- DDLogDebug("no action")
- }
- })
- }
- }
-
- fileprivate func renameFileAction(sourceFile f:OOFile,newFileName name:String){
- var url = ""
- var parameter:Dictionary<String,String> = [:]
- if f.fileType == .file {
- url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileRenameQuery, parameter: ["##id##":f.id! as AnyObject])!
- parameter["name"] = name
- parameter["folder"] = f.folder!
- }else if f.fileType == .folder {
- url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileFolderActionIdQuery,parameter: ["##id##":f.id! as AnyObject])!
- parameter["name"] = name
- parameter["superior"] = f.superior!
- }
- self.showLoading(title: "更新中")
- AF.request(url, method: .put, parameters: parameter, encoding: JSONEncoding.default, headers: nil).responseJSON { (response) in
- switch response.result {
- case .success(let val):
- let json = JSON(val)
- if json["type"] == "success" {
- self.myFiles.forEachEnumerated({ (index, file) in
- if file.id == f.id {
- file.name = name
- }
- })
- DispatchQueue.main.async {
- self.tableView.reloadData()
- self.showSuccess(title: "重命名完成")
- }
-
- }else{
-
- }
- case .failure(let err):
- DispatchQueue.main.async {
- DDLogError(err.localizedDescription)
- self.showError(title: "重命名失败")
- }
- }
- }
-
- }
-
- //重命名
- func fileRename(_ f:OOFile){
- let renameViewController = UIAlertController(title: "重命名", message: "原名称:\(f.name!)", preferredStyle: .alert)
- let okAction = UIAlertAction(title: "确定", style: .destructive) { (okAction) in
- let textField = renameViewController.textFields![0]
- if let text = textField.text {
- if text.isEmpty {
- DDLogDebug("empty name = \(text)")
- }else{
- DDLogDebug("new name = \(text)")
- self.renameFileAction(sourceFile: f, newFileName: text)
- }
- }
- }
-
- let cancelAction = UIAlertAction(title: "取消", style: .cancel) { (cancelAction) in
-
- }
- renameViewController.addTextField { (textField) in
- textField.placeholder = "请输入新名称"
- textField.textColor = UIColor.red
- }
- renameViewController.addAction(okAction)
- renameViewController.addAction(cancelAction)
-
- self.present(renameViewController, animated: true, completion: nil)
-
- }
-
- fileprivate func deleteFileAction(_ f:OOFile){
- var url = ""
- if f.fileType == .file {
- url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileDeleteQuery, parameter: ["##id##":f.id! as AnyObject])!
- }else if f.fileType == .folder {
- url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileFolderActionIdQuery, parameter: ["##id##":f.id! as AnyObject])!
- }
- self.showLoading(title: "删除中")
- AF.request(url,method:.delete, parameters: nil, encoding: JSONEncoding.default, headers: nil).responseJSON { (response) in
- switch response.result {
- case .success(let val):
- let json = JSON(val)
- if json["type"] == "success" {
- self.myFiles.remove(at: self.myFiles.index(where: { (file) -> Bool in
- if f.id == file.id {
- return true
- }else{
- return false
- }
- })!)
- DispatchQueue.main.async {
- self.tableView.reloadData()
- self.showSuccess(title: "删除成功")
- }
-
- }else{
- DispatchQueue.main.async {
- DDLogError("删除失败:\(json)")
- self.showError(title: "删除失败")
- }
-
- }
- case .failure(let err):
- DispatchQueue.main.async {
- DDLogError("删除失败:\(err)")
- self.showError(title: "删除失败")
- }
-
- }
- }
- }
-
- //删除
- func fileDelete(_ f:OOFile){
- let deleViewController = UIAlertController(title: "删除", message: "删除文件:\(f.name!)", preferredStyle: .alert)
- let okAction = UIAlertAction(title: "确定", style: .destructive) { (okAction) in
- //执行删除
- self.deleteFileAction(f)
- }
- let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)
- deleViewController.addAction(okAction)
- deleViewController.addAction(cancelAction)
- self.present(deleViewController,animated: true,completion: nil)
- }
-
- func fileMoveAction(){
- //移动
- var url = ""
- var parameter:[String:AnyObject] = [:]
- if moveSourceFile?.fileType == .file {
- url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileRenameQuery, parameter: ["##id##":(moveSourceFile?.id)! as AnyObject])!
- parameter["name"] = moveSourceFile?.name as AnyObject?
- parameter["folder"] = moveTargeFolder?.id as AnyObject?
- }else if moveSourceFile?.fileType == .folder {
- url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileFolderActionIdQuery, parameter: ["##id##":(moveSourceFile?.id)! as AnyObject])!
- parameter["name"] = moveSourceFile?.name as AnyObject?
- parameter["superior"] = moveTargeFolder?.id as AnyObject?
- }
- AF.request(url,method:.put, parameters: parameter, encoding: JSONEncoding.default , headers: nil).responseJSON { (response) in
- switch response.result {
- case .success(let val):
- let json = JSON(val)
- if json["type"] == "success" {
- self.myFiles.remove(at: self.myFiles.index(where: { (file) -> Bool in
- if self.moveSourceFile?.id == file.id {
- return true
- }else{
- return false
- }
- })!)
- DispatchQueue.main.async {
- self.tableView.reloadData()
- self.showSuccess(title: "移动完成")
- }
-
- }else{
- DispatchQueue.main.async {
- DDLogError(json.description)
- self.showError(title: "移动失败")
- }
-
- }
- case .failure(let err):
- DispatchQueue.main.async {
- DDLogError(err.localizedDescription)
- self.showError(title: "移动失败")
- }
- }
- }
-
- }
-
- //移动
- func fileMove(_ f:OOFile){
- self.moveSourceFile = f
- self.performSegue(withIdentifier: "showSelectFolderSegue", sender: nil)
- }
-
- func getRect() -> CGRect {
- return CGRect(
- x: view.centerX - 100 / 2,
- y: view.centerY - 100 / 2 - 33,
- width: 100,
- height: 100)
- }
-
- //下载
- func fileDownload(_ f:OOFile){
- //存储到私有目录
- let url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileDownloadItemIdQuery, parameter: ["##id##":f.id! as AnyObject])
-
- let destination:DownloadRequest.Destination = { temporaryURL, response in
- let baseURL = NSSearchPathForDirectoriesInDomains(.downloadsDirectory, .userDomainMask, true)[0]
- let folder = URL(fileURLWithPath:baseURL).appendingPathComponent("file", isDirectory: true)
- //判断文件夹是否存在,不存在则创建
- let exist = FileManager.default.fileExists(atPath: folder.path)
- if !exist {
- try! FileManager.default.createDirectory(at: folder, withIntermediateDirectories: true,
- attributes: nil)
- }
- return (folder.appendingPathComponent(f.name!), [.removePreviousFile, .createIntermediateDirectories])
- }
-
-
- self.showLoading(title: "下载中...")
- let utilityQueue = DispatchQueue.global(qos: .utility)
- AF.download(url!, to: destination).downloadProgress(queue: utilityQueue) { (progress) in
- print("progress.fractionCompleted = \(progress.fractionCompleted)")
- }.responseData { (resp) in
- DispatchQueue.main.async {
- self.hideLoading()
- }
- switch resp.result {
- case .success( _):
- DispatchQueue.main.async {
- self.showSuccess(title: "下载完成")
- }
- case .failure(let err):
- DispatchQueue.main.async {
- DDLogError(err.localizedDescription)
- self.showError(title: "下载失败")
- }
- }
- }
- }
-
- //分享
- func fileShare(_ f:OOFile){
- currentSharedFile = f
- self.performSegue(withIdentifier: "showSharePersonSegue", sender: nil)
- }
-
- func fileShareAction(){
- var names:[String] = []
- sharedPersons.forEach { (p) in
- names.append(p.name!)
- }
- let url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileShareActionQuery, parameter: ["##id##":(currentSharedFile?.id)! as AnyObject])
- self.showLoading(title: "分享中...")
- AF.request(url!, method:.put , parameters: ["shareList":names], encoding: JSONEncoding.default, headers: nil).responseJSON { (response) in
- switch response.result {
- case .success(let val):
- let json = JSON(val)
- if json["type"] == "success" {
- DispatchQueue.main.async {
- self.showSuccess(title: "分享成功")
- }
-
- }else{
- DispatchQueue.main.async {
- self.showError(title: "分享失败")
- }
- }
- case .failure(let err):
- DispatchQueue.main.async {
- DDLogError(err.localizedDescription)
- self.showError(title: "分享失败")
- }
- }
- }
-
- }
- }
- extension MainFileViewController:FileFolderPassValueDelegate{
- func selectedFolder(_ f: OOFile) {
- self.moveTargeFolder = f
- self.fileMoveAction()
- }
- }
- extension MainFileViewController:FolderHeaderViewDelegate{
- func headerClickSelected(currentFile f: OOFile, folderQueue fQueue: [OOFile]) {
- self.folderQueue = fQueue
- var url = ""
- if f.id == "0" {
- url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileTopListQuery, parameter: nil)!
- }else{
- url = AppDelegate.o2Collect.generateURLWithAppContextKey(FileContext.fileContextKey, query: FileContext.fileFolderItemIdQuery, parameter: ["##id##":f.id! as AnyObject])!
- }
- self.loadDataRequestFileCompleted(url)
- }
- }
- //quick look
- extension MainFileViewController:QLPreviewControllerDataSource,QLPreviewControllerDelegate{
-
- func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
- return fileURLs.count
- }
-
- func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
- return fileURLs[index] as QLPreviewItem
- }
-
- }
|