Search code examples
swiftalamofire

Why am I getting an ambiguous reference error on my alamofire multiformdata upload request?


So I'm just trying to send an image directly to S3, as instructed. But because of Swift versioning, I'm getting errors related to how it's written. I've tried to re-construct it parameter by parameter, but it seems to still return "Ambiguous reference to member 'upload(::headers:file:)'"

I'm using Swift 2.3 in the newest Xcode version with Alamofire 3.5

Alamofire.upload(.POST, json["url"], multipartFormData: { (multipartFormData) in
            if let key: String = json["s3"]["form-data"]["key"].string {
                multipartFormData.appendBodyPart(data: key.dataUsingEncoding(NSUTF8StringEncoding)!, name: "key")
            }
            if let acl: String = json["s3"]["form-data"]["acl"].string {
                multipartFormData.appendBodyPart(data: acl.dataUsingEncoding(NSUTF8StringEncoding)!, name: "acl")
            }
            if let signature = json["s3"]["form-data"]["signature"].string {
                multipartFormData.appendBodyPart(data: signature.dataUsingEncoding(NSUTF8StringEncoding)!, name: "signature")
            }
            if let AWSAccessKeyId = json["s3"]["form-data"]["AWSAccessKeyId"].string {
                multipartFormData.appendBodyPart(data: AWSAccessKeyId.dataUsingEncoding(NSUTF8StringEncoding)!, name: "AWSAccessKeyId")
            }
            if let policy = json["s3"]["form-data"]["policy"].string {
                multipartFormData.appendBodyPart(data: policy.dataUsingEncoding(NSUTF8StringEncoding)!, name: "policy")
            }
            if let success_action_status = json["s3"]["form-data"]["success_action_status"].string {
                multipartFormData.appendBodyPart(data: success_action_status.dataUsingEncoding(NSUTF8StringEncoding)!, name: "success_action_status")
            }
            multipartFormData.appendBodyPart(data: imageData, name: "file", mimeType: "image/jpeg")
            }) { (encodingResult) in
                switch encodingResult {
                case .Success(let upload, _, _):
                    upload.responseJSON { response in
                        debugPrint(response)
                        if let statusCode = response.response?.statusCode {
                            if statusCode == 201 {
                                break
                            }
                        }
                    }
                case .Failure(let encodingError):
                    break
                }
        }

Solution

  • upload() was overloaded by AlamoFire.

    You mention upload(::headers:file:), but you're trying to use something closer to upload(method::headers:multipartFormData:encodingMemoryThreshold:encodingCompletion:)

    So you can attempt to be more explicit about the parameters.

    guard let urlString = json["url"] as? URLStringConvertible else {
        return
    }
    Alamofire.upload(.POST, urlString, headers: nil, multipartFormData: { (multipartFormData) in
        ...
    }, encodingMemoryThreshold: Manager.MultipartFormDataEncodingMemoryThreshold) { (encodingResult) in
        ...