как загрузить файл и передать данные в параметре в Alamofire - swift 5 - PullRequest
1 голос
/ 27 января 2020

как загрузить файл и передать данные в параметре в Alamofire - swift 5

Мне нужно решение этой проблемы. Я хочу загрузить изображение на сервер с данными внутри параметра

Это запрос на почтальона enter image description hereenter image description here

Это мое решение ::

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)
                        }
                    }

                })
        }

    }

}

И этот ответ приходит от подача:

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

Я использую капсулу Alamofire и капсулу Swifty Json с iOS 13, swift 5 и Xcode 11

Пожалуйста, помогите мне:)

Ответы [ 2 ]

2 голосов
/ 27 января 2020

Вы должны передать данные изображения в MultipartFormData вместо передачи с другим параметром в словаре parameter.

Просто измените свой код, как показано ниже, и убедитесь, что он работает или нет.

//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")
          }
 }
1 голос
/ 27 января 2020

Не включать изображение в словарь параметров. Или пропустите это при добавлении в MultipartFormData следующим образом

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")
    }
}
...