简体   繁体   中英

How to upload image as a parameter, with other parameters using multipart form data in ios, swift3, Alamofire 4

I'm using Alamofire 4 with swift 3 to update user profile. and also I'm using Router class. What I need is to uplaod and image with other parameters. I can update users detail, without uploading the image part.

this is what it looks like in postman

在此处输入图片说明

so is it possible create an urlconvertible request for this . how can I upload the image with other parametes. (this works fine in postman). how can I do this with new Alamofire . I tried it like below.

let parameters = [
            "profile_image": "swift_file.jpeg"
        ]


        Alamofire.upload(multipartFormData: { (multipartFormData) in
            multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "file", fileName: "swift_file.jpeg", mimeType: "image/png")
            for (key, value) in parameters {
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
            }
        }, to:urltoUpdate)
        { (result) in
            switch result {
            case .success(let upload, _, _):
                print("the status code is :")

                upload.uploadProgress(closure: { (progress) in
                    print("something")
                })

                upload.responseJSON { response in
                    print("the resopnse code is : \(response.response?.statusCode)")
                    print("the response is : \(response)")
                }
              break
            case .failure(let encodingError):
                print("the error is  : \(encodingError.localizedDescription)")
                break
            }
        }

but this didn't work properly. hope your help with this part.

You do not need this:

"profile_image": "swift_file.jpeg"

And Parameters should be:

let parameters = [
    "firstname": "Bill",
    "surname": "fox",
    //...rest of the parameters
]

And this withName: "file" :

multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "file", fileName: "swift_file.jpeg", mimeType: "image/png")

Should be withName: "profile_image" :

multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "profile_image", fileName: "swift_file.jpeg", mimeType: "image/png")

Code with Headers:

let parameters = [
    "firstname": "Bill",
    "surname": "fox",
    //...rest of the parameters
]

let headers = [
    "somekey": "somevalue",
    //...rest of the parameters
]

Alamofire.upload(multipartFormData: { (multipartFormData) in

    multipartFormData.append(UIImageJPEGRepresentation(profileImage, 1)!, withName: "profile_image", fileName: "swift_file.jpeg", mimeType: "image/png")

    for (key, value) in parameters {
        multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
    }

}, usingThreshold:UInt64.init(),
   to: "", //URL Here
   method: .post,
   headers: headers, //pass header dictionary here
   encodingCompletion: { (result) in

    switch result {
    case .success(let upload, _, _):
        print("the status code is :")

        upload.uploadProgress(closure: { (progress) in
            print("something")
        })

        upload.responseJSON { response in
            print("the resopnse code is : \(response.response?.statusCode)")
            print("the response is : \(response)")
        }
        break
    case .failure(let encodingError):
        print("the error is  : \(encodingError.localizedDescription)")
        break
    }
})

Just Put This method in NSObjecte File .

import Alamofire`

class func postImageToUrl(_ serverlink:String,methodname:String,param:NSDictionary,image:UIImage!,withImageName : String,CompletionHandler:@escaping (Bool,NSDictionary) -> ()) {



        print("POST : " + serverlink + methodname + " and Param \(param) ")

        var fullLink = serverlink

        if fullLink.characters.count > 0 {

            fullLink = serverlink + "/" + methodname
        }
        else {

            fullLink = methodname
        }

        var imgData = Data()
        if image != nil {

            imgData = UIImageJPEGRepresentation(image!, 1.0)!
        }

        let notallowchar : CharacterSet = CharacterSet(charactersIn: "01234").inverted
        let dateStr:String = "\(Date())"
        let resultStr:String = (dateStr.components(separatedBy: notallowchar) as NSArray).componentsJoined(by: "")
        let imagefilename = resultStr + ".jpg"

        Alamofire.upload(multipartFormData:{ multipartFormData in
            multipartFormData.append(imgData, withName: withImageName as String, fileName: imagefilename, mimeType: "image/jpeg")

            for (key, value) in param {

                //let data = (value as! String).data(using: String.Encoding.utf8)!
                let data = (value as AnyObject).data(using: String.Encoding.utf8.rawValue)
                multipartFormData.append(data!, withName: key as! String)

            }
        },
        usingThreshold:UInt64.init(),
        to:fullLink,
        method:.post,
        headers:[:],
        encodingCompletion: { encodingResult in

            switch encodingResult {

                case .success(let upload, _, _):

                upload.uploadProgress { progress in // main queue by default

                    print("Upload Progress: \(progress.fractionCompleted)")
                }

                upload.responseJSON { response in

                    print(response)


                    if let TempresponseDict:NSDictionary = response.result.value as? NSDictionary {

                        if (TempresponseDict.object(forKey: "response") as? String)?.caseInsensitiveCompare("success") == .orderedSame {

                            CompletionHandler(true, TempresponseDict)
                        }
                        else {

                            var statusCode = response.response?.statusCode

                            if let error = response.result.error as? AFError {

                                statusCode = error._code // statusCode private

                                switch error {

                                case .invalidURL(let url):
                                    print("Invalid URL: \(url) - \(error.localizedDescription)")
                                case .parameterEncodingFailed(let reason):
                                    print("Parameter encoding failed: \(error.localizedDescription)")
                                    print("Failure Reason: \(reason)")
                                case .multipartEncodingFailed(let reason):
                                    print("Multipart encoding failed: \(error.localizedDescription)")
                                    print("Failure Reason: \(reason)")
                                case .responseValidationFailed(let reason):
                                    print("Response validation failed: \(error.localizedDescription)")
                                    print("Failure Reason: \(reason)")

                                    switch reason {

                                    case .dataFileNil, .dataFileReadFailed:
                                        print("Downloaded file could not be read")
                                    case .missingContentType(let acceptableContentTypes):
                                        print("Content Type Missing: \(acceptableContentTypes)")
                                    case .unacceptableContentType(let acceptableContentTypes, let responseContentType):
                                        print("Response content type: \(responseContentType) was unacceptable: \(acceptableContentTypes)")
                                    case .unacceptableStatusCode(let code):
                                        print("Response status code was unacceptable: \(code)")
                                        statusCode = code
                                    }
                                case .responseSerializationFailed(let reason):

                                    print("Response serialization failed: \(error.localizedDescription)")
                                    print("Failure Reason: \(reason)")
                                    // statusCode = 3840 ???? maybe..
                                }

                                print("Underlying error: \(error.underlyingError)")
                            }
                            else if let error = response.result.error as? URLError {

                                print("URLError occurred: \(error)")
                            }
                            else {

                                print("Unknown error: \(response.result.error)")
                            }

                            print("\(statusCode)") // the status code


                            CompletionHandler(false, TempresponseDict)
                        }
                    }
                    else {

                        CompletionHandler(false, NSDictionary())
                    }
                }

                case .failure(let encodingError):

                    print(encodingError)

                    CompletionHandler(false, NSDictionary())
            }
        })

}

2. Use

yourNSObjectClassName.postImageToUrl(MAIN_LINK, methodname: "MethodName", param: "ParametterInDictionary", image: "UploadImage", withImageName: "ImageParametterString") { (Success, responceOBJ) in
        if Success == true
        {
            print("Your image is uploaded")
        }
        else
        {
            print("Fail")
        }
    }

And You are set error code of webservice to server site to show error and after you get Right success.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM