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

import Foundation
import Qiniu
import CNLiveRequestBastKit
import CNLiveBaseTools
import CNLiveBusinessTools

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
    }
    
    /// 数字简历上传图片
    /// - Parameters:
    ///   - imageData: 图片数据
    ///   - progressBlock: 进度回调
    ///   - successBlock: 成功回调
    static func uploadViateImage(imageData: NSData, progressBlock:@escaping ProgressBlcok, successBlock: @escaping SuccessBlock) -> String {
        let key = UploadManager.createViateImageFileName()
        UploadManager.uploadData(madiaData: imageData, key: key, progress: progressBlock, success: successBlock)
        return key
    }
    
    /// 数字简历上传视频
    /// - Parameters:
    ///   - imageData: 视频数据
    ///   - progressBlock: 进度回调
    ///   - successBlock: 成功回调
    static func uploadViateVideo(videoData: NSData, progressBlock:@escaping ProgressBlcok, successBlock: @escaping SuccessBlock) -> String {
        let key = UploadManager.createViateVideoFileName()
        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("802_li40qhp922", forKey: "appId")//CNLiveMCEnvironmentManager.shared.appId
        param.setValue("POST", forKey: "verb")
        param.setValue("2", forKey: "storageType")
        param.setValue(kBucketName_QN, forKey: "bucket")
        param.setValue("\(CNLiveTimeTools.getNow10NumTimestamp())", forKey: "timestamp")
        param.setValue("2", forKey: "appType")
        param.setValue("i", forKey: "clientPlat")
        param.setValue("ios", forKey: "frmId")
        param.setValue("i", forKey: "plat")
        
        let signParam = CNLiveBusinessTools.encryptionSign(withParameter: NSMutableDictionary(dictionary: param), encryptionKey: "ae3a7ad3e4b9beb7cfe2078db648ebb89aa249ca2e82ac")
        let newParam: [String: Any] = signParam as? [String: Any] ?? [:]
        
        let custom_param = NSMutableDictionary()
        custom_param.setValue("802_li40qhp922", forKey: "appId")//CNLiveMCEnvironmentManager.shared.appId
        custom_param.setValue("ae3a7ad3e4b9beb7cfe2078db648ebb89aa249ca2e82ac", forKey: "appKey")//CNLiveMCEnvironmentManager.shared.appKey
        CNLiveNetworking.setupCustomParam(custom_param as? [String : String])
        CNLiveNetworking.setupShowResult(true)
        CNLiveNetworking.setAllowRequestDefaultArgument(false)
        CNLiveNetworking.setupShowDataResult(false)
        CNLiveNetworking.setupSignRequestKey("ae3a7ad3e4b9beb7cfe2078db648ebb89aa249ca2e82ac")//CNLiveMCEnvironmentManager.shared.appKey)//APPKey_wjj APPKey
                
        CNLiveNetworking.requestNetwork(with: .POST, urlString: "\(CNLiveMCEnvironmentManager.shared.img_token_url)/vod_epg/getUploadAuthForApp", param: newParam 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: "上传失败")
                                }
                                if success != nil {
                                    success!("", "")
                                }
                            }
                        }, option: uploadOption)
                    }
                } else {
                    //showMessage(message: resp["errorMessage"] as! String)
                    if success != nil {
                        success!("", "")
                    }
                }
            } else {
                showMessage(message: error?.localizedDescription ?? "上传失败")
                if success != nil {
                    success!("", "")
                }
            }
        }
    }
    
    /// 设置图片名称
    /// - 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
    }
    
    ///数字简历使用的bucket,图片bucket是"vitae_photo_" , 视频是"vitae_video_"
    /// 设置图片名称
    /// - Returns: 图片名
    static private func createViateImageFileName() -> String {
        let imageName = "802/mateCode/img/vitae_photo_0/\(NSDate().string(withFormat: "yyyy/MM/dd") )/\(arc4random()).jpg"
        return imageName
    }
    
    /// 设置视频名称
    /// - Returns: 图片名
    static private func createViateVideoFileName() -> String {
        let imageName = "802/mateCode/video/vitae_video_0/\(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
}