CNLiveCommonQiniuTool.swift 6.94 KB
//
//  CNLiveCommonQiniuTool.swift
//  metaCode
//
//  Created by open on 2023/6/15.
//

import Foundation
import Qiniu
import CNLiveRequestBastKit

typealias ProgressBlcok = (_ key: String,_ percent: CGFloat) -> Void
typealias SuccessBlock = (_ key: String,_ url: String) -> Void

class UploadManager: NSObject {
    
    var uploadModels = NSMutableArray()
    var qnUploadManager = QNUploadManager()
    static let shared = UploadManager()
    private override init() {
        super.init()
        let config = QNConfiguration.build { builder in
            builder?.useHttps = true;
            do {
                builder?.recorder = try QNFileRecorder(folder: "元码")
            } catch {}
        }
        qnUploadManager = QNUploadManager(configuration: config)
    }
    
    
    
    /// 上传图片
    /// - Parameters:
    ///   - imageData: 图片数据
    ///   - progressBlock: 进度回调
    ///   - successBlock: 成功回调
    static func uploadImage(imageData: NSData, progressBlock:@escaping ProgressBlcok, successBlock: @escaping SuccessBlock) -> String {
        let key = UploadManager.createImageFileName()
        UploadManager.uploadData(madiaData: imageData, key: key, progress: progressBlock, success: successBlock)
        return key
    }
    
    /// 上传视频
    /// - Parameters:
    ///   - imageData: 视频数据
    ///   - progressBlock: 进度回调
    ///   - successBlock: 成功回调
    static func uploadVideo(videoData: NSData, progressBlock:@escaping ProgressBlcok, successBlock: @escaping SuccessBlock) -> String {
        let key = UploadManager.createVideoFileName()
        UploadManager.uploadData(madiaData: videoData, key: key, progress: progressBlock, success: successBlock)
        return key
    }
    
    // MARK: - 取消上传
    func cancelUploadKey(key:String){
        for (_,obj) in self.uploadModels.enumerated() {
            let model = obj as! QiNiuUploadModel
            if model.key == key{
                model.isCancel = true
                break
            }
        }
    }
    // MARK: - 删除云中图片
    func requestQiNiuDeleteImageUrl(imageUrl:String,resultBlock:@escaping downSlideResultBlock){
        
        let param = NSMutableDictionary()
        param.setValue(imageUrl, forKey: "img")
        showLoading(message: "处理中...")
        CNLiveNetworking.setAllowRequestDefaultArgument(true)
        CNLiveNetworking.setupShowDataResult(false)
        CNLiveNetworking.setupDSRequest(true)
        CNLiveNetworking.requestNetwork(with: .POST, urlString: APPBaseWjjBUrl+"/Api/v1/delQiniuImg", param: param as! [String : String], cacheType: .networkOnly) { task, result, error in
            hiddenLoading()
            if (error == nil) {
                resultBlock(result as Any,.success)
            }else{
                resultBlock(NSNull(),.failed)
            }
        }
        
    }
    
    /// 上传到七牛
    /// - Parameters:
    ///   - data: 上传数据
    ///   - key: key
    ///   - uploadProgress: 上传进度
    ///   - resultBlock: 结果
    static private func uploadData(madiaData: NSData, key: String, progress: ProgressBlcok?, success: SuccessBlock?) {
        let param = NSMutableDictionary()
        param.setValue(APPId, forKey: "appId")
        param.setValue("POST", forKey: "verb")
        param.setValue("2", forKey: "storageType")
        param.setValue(kBucketName_QN, forKey: "bucket")
        CNLiveNetworking.setupShowResult(true)
        CNLiveNetworking.setAllowRequestDefaultArgument(true)
        CNLiveNetworking.setupShowDataResult(false)
        CNLiveNetworking.setupSignRequestKey(APPKey)//APPKey_wjj APPKey

        CNLiveNetworking.requestNetwork(with: .POST, urlString: "\(CNLiveEnvironmentManager.shared.img_token_url)/vod_epg/getUploadAuthForApp", param: param as! [String : String], cacheType: .networkOnly) { task, result, error in
            hiddenLoading()

            if (error == nil) {
                let resp = result as! NSDictionary
                let errorCode = "\(resp["errorCode"] ?? 0)"
                if (errorCode == "0") {
                    let data = resp["data"] as! Dictionary<String, Any>
                    let token = data["token"] as! String
                    if token.isNotBlank() {
                        let uploadModel = QiNiuUploadModel.init()
                        uploadModel.isCancel = false
                        uploadModel.key = key
                        let uploadOption = QNUploadOption.init(mime: nil, progressHandler: { key, percent in
                            DispatchQueue.main.async {
                                progress!(key!, CGFloat(percent))
                            }
                        }, params: nil, checkCrc: false) {
                            return uploadModel.isCancel
                        }
                        uploadModel.uploadOption = uploadOption!
                        UploadManager.shared.uploadModels.add(uploadModel)
                        showLoading(message: "上传中...")
                        let url_key = "http://wjjtest.ys2.cnliveimg.com/"+key
                        UploadManager.shared.qnUploadManager?.put(madiaData as Data, key: key, token: token, complete: { info, key, resp in
                            hiddenLoading()
                            //删除上传选项
                            UploadManager.shared.uploadModels.remove(uploadModel)
                            if info?.statusCode == 200 {
                                if success != nil {
                                    success!(key!, url_key)
                                }
                            } else {
                                if info?.statusCode == -999 {
                                    showMessage(message: "上传取消")
                                } else {
                                    showLoading(message: "上传失败")
                                }
                            }
                        }, option: uploadOption)
                    }
                } else {
                    showMessage(message: resp["errorMessage"] as! String)
                }
            } else {
                showMessage(message: error?.localizedDescription ?? "上传失败")
            }
        }
    }
    
    /// 设置图片名称
    /// - Returns: 图片名
    static private func createImageFileName() -> String {
        let imageName = "802/mateCode/img/\(NSDate().string(withFormat: "yyyy/MM/dd") )/\(arc4random()).jpg"
        return imageName
    }
    
    /// 设置视频名称
    /// - Returns: 图片名
    static private func createVideoFileName() -> String {
        let imageName = "802/mateCode/video/\(NSDate().string(withFormat: "yyyy/MM/dd") )/\(arc4random()).mp4"
        return imageName
    }
}

class QiNiuUploadModel: BaseModel {
        
    required init() {
        self.uploadOption = QNUploadOption.defaultOptions()
    }
    ///上传文件的key
    var key:String = ""
    var uploadOption:QNUploadOption
    var isCancel:Bool = false
}