美文网首页
Swift3.0之七牛上传图片生成本地token

Swift3.0之七牛上传图片生成本地token

作者: Miu七七 | 来源:发表于2017-03-03 16:01 被阅读146次

    先写一个方法按照七牛技术文档说的拼接token

     func generateToken(accessKey: NSString!, secretKey: NSString!, bucketName: NSString!) -> String{
            
            let deadline = NSDate().timeIntervalSince1970
          print(deadline)
    
            print(Int(deadline))
            
            let policyDict: Dictionary<AnyHashable, Any> = ["scope": bucketName, "deadline": Int(deadline) + 3600]
            
            
            print(policyDict)
        
            let policyJSONData = try! JSONSerialization.data(withJSONObject: policyDict, options: .prettyPrinted)
            
            let policyJSON = NSString(data: policyJSONData, encoding: String.Encoding.utf8.rawValue)
                    print(policyJSON as! String)
            
            let policyData = policyJSON?.data(using: String.Encoding.utf8.rawValue)
            let encodedPolicy = QN_GTM_Base64.string(byWebSafeEncoding: policyData, padded: true)
        
        
        
                    print(encodedPolicy)
        
            let hmacStr = encodedPolicy?.hmac(algorithm: .SHA1, key: secretKey as String)
            let hmacData = hmacStr?.data(using: .utf8)
            let encodedSigned = QN_GTM_Base64.string(byWebSafeEncoding: hmacData, padded: true)
            
                    print(encodedSigned)
        
            let token = "\(accessKey!):\(encodedSigned!)=:\(encodedPolicy!)"
        
        
            
         print(token)
        
            
            return token
            
        }
    
    

    加密扩展类的写法String+HMAC.swift

        import Foundation
        enum CryptoAlgorithm {
        case MD5, SHA1, SHA224, SHA256, SHA384, SHA512
        var HMACAlgorithm: CCHmacAlgorithm {
            var result: Int = 0
            switch self {
            case .MD5:      result = kCCHmacAlgMD5
            case .SHA1:     result = kCCHmacAlgSHA1
            case .SHA224:   result = kCCHmacAlgSHA224
            case .SHA256:   result = kCCHmacAlgSHA256
            case .SHA384:   result = kCCHmacAlgSHA384
            case .SHA512:   result = kCCHmacAlgSHA512
            }
            return CCHmacAlgorithm(result)
        }
        
        var digestLength: Int {
            var result: Int32 = 0
            switch self {
            case .MD5:      result = CC_MD5_DIGEST_LENGTH
            case .SHA1:     result = CC_SHA1_DIGEST_LENGTH
            case .SHA224:   result = CC_SHA224_DIGEST_LENGTH
            case .SHA256:   result = CC_SHA256_DIGEST_LENGTH
            case .SHA384:   result = CC_SHA384_DIGEST_LENGTH
            case .SHA512:   result = CC_SHA512_DIGEST_LENGTH
            }
            return Int(result)
        }
    }
    extension String {
        func hmac(algorithm: CryptoAlgorithm, key: String) -> String {
            let str = self.cString(using: String.Encoding.utf8)
            let strLen = Int(self.lengthOfBytes(using: String.Encoding.utf8))
            let digestLen = algorithm.digestLength
            let result = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLen)
            let keyStr = key.cString(using: String.Encoding.utf8)
            let keyLen = Int(key.lengthOfBytes(using: String.Encoding.utf8))
            
            CCHmac(algorithm.HMACAlgorithm, keyStr!, keyLen, str!, strLen, result)
            
            let digest = stringFromResult(result: result, length: digestLen)
            
            result.deallocate(capacity: digestLen)
            
            return digest
        }
        private func stringFromResult(result:     UnsafeMutablePointer<CUnsignedChar>, length: Int) -> String {
            let hash = NSMutableString()
            for i in 0..<length {
                hash.appendFormat("%02x", result[i])
            }
            return String(hash)
        }
    }
    
    

    调用方法

          //上传骑牛
            let access_key = "你的access_key"
            
            let secretKey = "你的secretKey"
            
            let name:NSString = "你的bucketName"
    
       let token = generateToken(accessKey:access_key as      NSString!, secretKey:secretKey as NSString!, bucketName:name)
    
    
    let upManager = QNUploadManager()
     upManager?.putFile(filePath, key:nil, token: token, complete: { (info, key, resp) in
                    
                    if (info?.isOK)!{
                        //上传完毕
                        
                       SVProgressHUD.showSuccess(withStatus: "上传成功")
                        
                        print(key)
                        
                        print(info)
    //
                        print(resp)
                        
                        
             
                    }else{
                        //失败
                        
                        print(key)
                        
                        print(info)
                        
                        print(resp)
    
                        
                    }
                    
                }, option: nil)
    
    
    

    完毕结果发现被后台给坑了,这玩意千万不能本地生成,要从后台拿~~

    ···

    相关文章

      网友评论

          本文标题:Swift3.0之七牛上传图片生成本地token

          本文链接:https://www.haomeiwen.com/subject/grkrgttx.html