如何使用Alamofire.upload和HTTPS请求上传分段数据?

时间:2018-11-20 03:40:56

标签: swift https alamofire multipartform-data

我使它可以处理HTTP请求,但是仍然找不到使用alamofire / upload / multipartFormData发出HTTPS请求的方法。有人可以帮忙吗?

func UploadUserPhoto (Photo: UIImage, Username: String, completion: @escaping (_ result: Bool) -> Void){
    let serverTrustPolicy = ServerTrustPolicy.pinCertificates(
        certificates: ServerTrustPolicy.certificates(),
        validateCertificateChain: true,
        validateHost: true
    )
    let serverTrustPolicies: [String: ServerTrustPolicy] = [
        "***********": serverTrustPolicy,
    ]
    let sessionManager = SessionManager(
        serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
    )
    let parameters = ["Authorization": Token ?? "Does not contain authorization information"]
    sessionManager.upload(multipartFormData: { multipartFormData in
        if let imageData = Photo.jpegData(compressionQuality: 1) {
            multipartFormData.append(imageData, withName: "Photo", fileName: "file.png", mimeType: "image/png")
        }
        for (key, value) in parameters {
            multipartFormData.append((value.data(using: .utf8))!, withName: key)
        }}, to: "https://***********/uploaduserphoto/\(Username)", method: .post, headers: parameters,
            encodingCompletion: { encodingResult in
                switch encodingResult {
                case .success(let upload, _, _):
                    upload.response(completionHandler: { (response) in
                        if response.response?.statusCode == 200{
                            completion(true)
                        } else {
                            completion(false)
                        }
                    })
                case .failure(let encodingError):
                    print("error:\(encodingError)")
                    completion(false)
                }
    })
}

更新: 我终于发现代码是好的,证书是坏的。重新创建自签名证书后,我开始工作。谢谢

错误表明:

2018-11-20 12:49:45.130697+0800 TalentBaby1.0[1359:288066] Task <09FA46A5-9791-42DB-97AD-78A351050916>.<1> load failed with error Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo={NSErrorFailingURLStringKey=https://*******/uploaduserphoto/User, NSErrorFailingURLKey=https://*******/uploaduserphoto/User, _NSURLErrorRelatedURLSessionTaskErrorKey=("LocalUploadTask <09FA46A5-9791-42DB-97AD-78A351050916>.<1>"), _NSURLErrorFailingURLSessionTaskErrorKey=LocalUploadTask <09FA46A5-9791-42DB-97AD-78A351050916>.<1>, NSLocalizedDescription=cancelled} [-999]

1 个答案:

答案 0 :(得分:0)

由于您已经在使用Alamofire,请尝试使用其上载而不是SessionManager上载。试试这个:

func UploadUserPhoto(Photo: UIImage, Username: String, completion: @escaping (_ result: Bool) -> Void){

    let headers = ["Authorization": Token ?? "Does not contain authorization information"]

    Alamofire.upload(multipartFormData:{ multipartFormData in
        if let imageData = Photo.jpegData(compressionQuality: 1) {
            multipartFormData.append(imageData, withName: "Photo", fileName: "file.png", mimeType: "image/png")
        }
    },
                     usingThreshold:UInt64.init(),
                     to:"https://***********/uploaduserphoto/\(Username)",
        method:.post,
        headers:headers,
        encodingCompletion: { encodingResult in
            switch encodingResult {
            case .success(let upload, _, _):
                upload.response(completionHandler: { (response) in
                    if response.response?.statusCode == 200{
                        completion(true)
                    } else {
                        completion(false)
                    }
                })
            case .failure(let encodingError):
                print("error:\(encodingError)")
                completion(false)
            }
    })
}