Alamofire Multiform Загрузка изображения с параметрами

Я использую Alamofire для загрузки изображения на сервер, этот метод работает нормально, и я уже использовал его во многих проектах.

Я использовал следующий код для загрузки изображения на свой сервер с использованием многообразных данных.

Alamofire.upload( multipartFormData: { multipartFormData in

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

    let imageData = image?.pngData()

    multipartFormData.append(imageData!, withName: "profile_image", fileName: "profileImage", mimeType: "")

}, to: getURL(.addProfile), headers: getHeaders(), encodingCompletion: { encodingResult in

    switch encodingResult {

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

        upload.response(completionHandler: { (defaultDataResponse) in

            guard let httpResponse = defaultDataResponse.response else {
                completion(nil, defaultDataResponse.error)
                return
            }

            if httpResponse.statusCode == 200 {

                do {

                    let genericModel = try JSONDecoder().decode(ProfileImageModel.self, from: defaultDataResponse.data!)
                    completion(genericModel, nil)

                } catch {

                    completion(nil, error)
                }

            } else {
                completion(nil, defaultDataResponse.error)
            }
        })

    case .failure(let encodingError):
        completion(nil, encodingError)
    }
})

Это прекрасно работает.

Моя проблема здесь, где передача дополнительных параметров в API.

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

Приведенный выше код преобразует строковое значение в данные и добавляет к multipartFormData. И это работает для следующего типа структуры запроса.

{
    "first_name": "ABC",
    "last_name": "XYZ",
    "bio": "iOS Developer"
}

Что делать, если у меня следующий тип структуры запроса?

{
    "first_name": "ABC",
    "last_name": "XYZ",
    "bio": "iOS Developer"
    "location": {
        "full_address": "My Location",
        "latitude": "23.0000",
        "longitude": "76.0000"
    }
}

Пожалуйста, помогите достичь этого.

Это зависит от того, что ожидает ваш сервер.

arturdev 28.03.2019 09:55

Например, если ваш сервер ожидает строку в кодировке json, вы можете преобразовать словарь location в строку JSON и добавить эти данные в свою форму.

arturdev 28.03.2019 09:59

Хорошо, я понял твою точку зрения. Позвольте мне проверить это.

Mayur Karmur 28.03.2019 10:00

Если это сработает для вас, дайте мне знать, чтобы опубликовать как ответ

arturdev 28.03.2019 10:12

@arturdev, конечно.

Mayur Karmur 28.03.2019 10:13

Небольшая подсказка: pastebin.com/raw/nZFt2HUL

arturdev 28.03.2019 10:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
217
1

Ответы 1

Используйте эту функцию

 func requestUploadImage(_ strURL : String, imageData : Data? ,params : [String : AnyObject]?, headers : [String : String]?, success:@escaping (NSDictionary) -> Void, failure:@escaping (Error) -> Void){
//        let  params = ["id": "101", "name": "Navin", "timezone": "2018-07-26  03:17:06" , "image": imageData] as [String : AnyObject]
  //
        //  CommonMethodsModel.showProgrssHUD()
    let url = URL(string: baseURL + strURL)!
    let parameters = params //Optional for extra parameter

        Alamofire.upload(multipartFormData: { multipartFormData in
            multipartFormData.append(imageData!, withName: "image",fileName: "file.jpeg", mimeType: "image/jpeg")
            print(imageData , params)
            for (key, value) in parameters! {
                multipartFormData.append(value.data(using: String.Encoding.utf8.rawValue)!, withName: key)
            } //Optional for extra parameters
        },
                 usingThreshold: UInt64.init(),         to:url, method: .post)
        { (result) in
//             CommonMethodsModel.HidePrgressHUD()
            switch result {
            case .success(let upload, _, _):

                upload.uploadProgress(closure: { (progress) in
                    print("Upload Progress: \(progress.fractionCompleted)")
                })

                upload.responseJSON { response in
                    print(response.result.value)

                    success(response.result.value as! NSDictionary )
                }

            case .failure(let encodingError):
                print(encodingError)
            }
        }

    }

Я использую тот же метод, просто проверьте свою структуру параметров. Это не будет работать, когда есть объект местоположения, приложение вылетит.

Mayur Karmur 28.03.2019 10:12

@MayurKarmur Вместо использования объекта местоположения, почему бы вам не создать словарь местоположения и не использовать его. Вы пробовали это?

dahiya_boy 28.03.2019 10:16

Я использую этот код, и он отлично работает в моих проектах для сложной комбинации словарей массивов, проверьте параметры в моем методе.

NavinBagul 28.03.2019 10:17

@NavinBagul Просто хотел узнать, что такое withName и fileName в составных частях. Я никогда не мог понять разницу. P.S. попробуйте использовать [String : Any] и избегать AnyObject.

dahiya_boy 28.03.2019 10:52

@dahiya_boy я думаю, что withName и fileName - это просто строки, которые вы можете передать, что хотите.

Zღk 28.03.2019 11:05

@dahiya_boy 1) name : имя, которое будет связано с данными в HTTP-заголовке Content-Disposition. 2)fileName: имя файла, которое будет связано с данными в Content-Disposition HTTP-заголовке. 3)mimeType: тип MIME, который будет связан с данными в Content-Type HTTP-заголовке. github.com/Alamofire/Alamofire/blob/…

NavinBagul 28.03.2019 11:26

@dahiya_boy name: ваш ключ API, например «loginName»: Dahiya ,,, fileName: — какое имя вы хотите сохранить в БД, например, name.jpg, mimeType: тип файла

NavinBagul 10.04.2019 08:49

Другие вопросы по теме