func putObject()

in OSSSwiftDemo/OSSSwiftDemo/Classes/OSSRootViewController.swift [322:365]


    func putObject(image: UIImage) -> Void {
        let request = OSSPutObjectRequest()
        request.uploadingData = UIImagePNGRepresentation(image)!
        request.bucketName = OSS_BUCKET_PRIVATE
        request.objectKey = "landscape-painting.jpeg"
        request.uploadProgress = { (bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) -> Void in
            print("bytesSent:\(bytesSent),totalBytesSent:\(totalBytesSent),totalBytesExpectedToSend:\(totalBytesExpectedToSend)");
        };
        
        let provider = OSSFederationTokenCredentialProvider {
            let tcs = TaskCompletionSource()
            DispatchQueue(label: "test").async {
                Thread.sleep(forTimeInterval: 10)
                let token = OSSFederationToken()
                token.tAccessKey = "STS.tAccessKey"
                token.tSecretKey = "tSecretKey"
                token.tToken = "tToken"
                token.expirationTimeInGMTFormat = "2023-05-23T07:34:27Z"
                // or tcs.trySetError(<#T##error: Error##Error#>)
                tcs.trySetResult(token)
            }
            tcs.wait(timeout: 5)
            if let error = tcs.task.error {
                let nsError = error as NSError
                if nsError.code == OSSClientErrorCODE.codeNotKnown.rawValue,
                   let errorMessage = nsError.userInfo[OSSErrorMessageTOKEN] as? String,
                   errorMessage == "TaskCompletionSource wait timeout." {
                    // 超时错误
                }
                throw error
            } else if let result = tcs.task.result as? OSSFederationToken {
                return result
            }
            throw NSError(domain: OSSClientErrorDomain,
                          code: OSSClientErrorCODE.codeSignFailed.rawValue,
                          userInfo: [OSSErrorMessageTOKEN : "Can not get FederationToken."])
        }
        
        let client = OSSClient(endpoint: OSS_ENDPOINT, credentialProvider: provider)
        let task = client.putObject(request)
        task.continue({ (t) -> Any? in
            self.showResult(task: t)
        }).waitUntilFinished()
    }