【问题标题】:Alamofire request body nil when uploading image using multipartFormData使用 multipartFormData 上传图像时 Alamofire 请求正文为零
【发布时间】:2018-08-09 12:36:02
【问题描述】:

我似乎在使用 Alamofire 上传图片和传递参数时遇到问题。我有一个非常简单的多部分数据函数,如下所示:

sessionManager.upload(multipartFormData: { (multipartFormData) in
        for (key, value) in parameters {
            print("\(value)")
            multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key as String)
        }
        multipartFormData.append(UIImagePNGRepresentation(image)!, withName: "document", mimeType: "image/png")

    }, to: baseURL + "/documents", encodingCompletion: { (result) in
        switch result{
            case .success(let upload, _, _):
                upload.validate().responseJSON { response in
                    print("Succesfully uploaded")

                }
            case .failure(let error):
                print("Error in upload: \(error.localizedDescription)")

            }
    })

我已经为标头和授权实现了 OAuth2Handler,它适用于所有其他请求。我也尝试过直接使用 Alamofire 对象在没有包装器的情况下实现这一点,但仍然没有运气。当我检查请求时,我注意到 httpBody 始终为零,这对应于我从服务器收到的错误,并且消息说我没有传递必需的参数。

【问题讨论】:

    标签: swift alamofire


    【解决方案1】:

    这对我有用 Swift 4

    func callPostApiImage(api:String, parameters:[String:AnyObject]?,image:UIImage,Name:String, mime_type:String = "image/jpg",  complition:@escaping (AnyObject)->Void){
    
        // Encode Data
        let base64EncodedString = toBase64EncodedString(toJsonString(parameters: parameters!))
    
        let File_name = "image_" + String(arc4random()) + ".jpg"
    
        Alamofire.upload(multipartFormData: { (multipartFormData) in
    
            multipartFormData.append(UIImageJPEGRepresentation(image, 0.5)!, withName: Name, fileName: File_name, mimeType: mime_type)
            multipartFormData.append(base64EncodedString.data(using: String.Encoding.utf8)!, withName: "jsondata")
    
        }, to:api){ (result) in
    
            switch result {
    
            case .success(let upload, _, _):
    
                upload.uploadProgress(closure: { (progress) in
    
                    print(progress)
    
                })
    
                upload.responseJSON { response in
    
                    print(response.result)
    
                }
    
            case .failure(let encodingError):
    
                print("",encodingError.localizedDescription)
                break
            }
        }
    }
    
    // Base64EncodedString
    func toBase64EncodedString(_ jsonString : String) -> String
    {
        let utf8str = jsonString.data(using: .utf8)
    
        let base64Encoded = utf8str?.base64EncodedString(options: [])
    
        return base64Encoded!
    }
    

    【讨论】:

    • @VadimF。抱歉,亲爱的回复晚了,请检查更新的答案我已经添加了 toBase64EncodedString 函数,如果您有任何其他问题,请随时在此处发表评论 :)
    猜你喜欢
    • 2019-03-04
    • 2017-11-23
    • 2016-04-11
    • 2017-08-15
    • 2019-11-07
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    相关资源
    最近更新 更多