简体   繁体   中英

how to upload file and pass data in parameter in Alamofire - swift 5

how to upload file and pass data in parameter in Alamofire - swift 5

I need a solution to this problem I want to upload a picture to the server with data inside the parameter

This is the request on postman在此处输入图片说明 在此处输入图片说明

This is my solution ::

func createPhoto(name : String , email : String,gender:String,region:String,bod:String,activity_name:String,organisation_name:String,photo: UIImage, completion: @escaping (_ error: Error?, _ success: Bool)->Void) {

    var Token : String?
    var  tasksMO = [NSManagedObject]()
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "ConfirmActivationEntity")
    do {
        let results = try pe.context.fetch(request)
        tasksMO = results as! [NSManagedObject]
        for taskmo in tasksMO {
            Token = (taskmo.value(forKey: "access_token")  as! String )
        }
        print("assbil")
    } catch {
        print("fild")
    }
    print(" Token :\(Token!)")

    let headers : HTTPHeaders = ["Authorization":"Bearer \(Token!)","X-HTTP-Method-Override":"PUT","Accept-Language" : Locale.current.languageCode ?? "ar", "Content-Type" : "application/x-www-form-urlencoded","Accept" : "application/json"]


    let parameters : Parameters = ["name" : name,"region":region,"activity_id":ActivityCode!,"organization_id":OrganizationCode!,"gender":gender,"job_id":JobCode!,"interest_id":IntrestedCode!,"organisation_name":organisation_name,"activity_name":activity_name,"bod":bod,"city":region,"email":email,"profile_pic":photo]

    guard let url = URL(string: "\(UrlApi.url)\(UrlApi.crateUser)") else { return }


    Alamofire.upload(multipartFormData: { (form: MultipartFormData) in

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

        //                if let data = imagedata{
        //                    multipartFormData.append(data, withName: "imagename", fileName: "imagename.jpg", mimeType: "image/jpeg")
        //                }

        if let data = photo.jpegData(compressionQuality: 0.5) {
            form.append(data, withName: "profile_pic", fileName: "photo.png", mimeType: "image/png")
        }

    }, usingThreshold: SessionManager.multipartFormDataEncodingMemoryThreshold, to: url,method: .post, headers: headers) { (result: SessionManager.MultipartFormDataEncodingResult) in

        switch result {
        case .failure(let error):
            print(error)
            completion(error, false)

        case .success(request: let upload, streamingFromDisk: _, streamFileURL: _):

            upload.uploadProgress(closure: { (progress: Progress) in
                print(progress)
            })
                .responseJSON(completionHandler: { (response: DataResponse<Any>) in

                    switch response.result
                    {
                    case .failure(let error):
                        print(error)
                        completion(error, false)

                    case .success(let value):
                        let json = JSON(value)
                        print(json)

                        if let status = json["status"].toInt, status == 1 {
                            // success
                            print("Upload Succeed")
                            completion(nil, true)
                        } else {
                            print("Upload Failed")
                            completion(nil, false)
                        }
                    }

                })
        }

    }

}

And this response comes from the serve :

responseSerializationFailed(reason: Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(error: Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}))

I am using the Alamofire pod and the SwiftyJson pod with iOS 13, swift 5 and Xcode 11

Please help me :)

Don't include image in parameters dictionary. Or skip that when adding to MultipartFormData as follows

Alamofire.upload(multipartFormData: { form in
    for (key, value) in parameters {
        if !(value is UIImage), let data = "\(value)".data(using: .utf8) {
            form.append(data, withName: key as String)
        }
    }
    if let data = photo.jpegData(compressionQuality: 0.5) {
        form.append(data, withName: "profile_pic", fileName: "photo.png", mimeType: "image/png")
    }
}

You should pass the image data in MultipartFormData instead of passing with the other parameter in the parameter dictionary.

Just change your code like below and check it is working or not.

//Remove profile pic param from parameters.
let parameters : Parameters = ["name" : name,"region":region,"activity_id":ActivityCode!,"organization_id":OrganizationCode!,"gender":gender,"job_id":JobCode!,"interest_id":IntrestedCode!,"organisation_name":organisation_name,"activity_name":activity_name,"bod":bod,"city":region,"email":email]

guard let url = URL(string: "\(UrlApi.url)\(UrlApi.crateUser)") else { return }

Alamofire.upload(multipartFormData: { (form: MultipartFormData) in

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

          if let data = photo.jpegData(compressionQuality: 0.5) {
               form.append(data, withName: "profile_pic", fileName: "photo.png", mimeType: "image/png")
          }
 }

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