Я использую 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"
}
}
Пожалуйста, помогите достичь этого.
Например, если ваш сервер ожидает строку в кодировке json, вы можете преобразовать словарь location в строку JSON и добавить эти данные в свою форму.
Хорошо, я понял твою точку зрения. Позвольте мне проверить это.
Если это сработает для вас, дайте мне знать, чтобы опубликовать как ответ
@arturdev, конечно.
Небольшая подсказка: pastebin.com/raw/nZFt2HUL





Используйте эту функцию
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)
}
}
}
Я использую тот же метод, просто проверьте свою структуру параметров. Это не будет работать, когда есть объект местоположения, приложение вылетит.
@MayurKarmur Вместо использования объекта местоположения, почему бы вам не создать словарь местоположения и не использовать его. Вы пробовали это?
Я использую этот код, и он отлично работает в моих проектах для сложной комбинации словарей массивов, проверьте параметры в моем методе.
@NavinBagul Просто хотел узнать, что такое withName и fileName в составных частях. Я никогда не мог понять разницу. P.S. попробуйте использовать [String : Any] и избегать AnyObject.
@dahiya_boy я думаю, что withName и fileName - это просто строки, которые вы можете передать, что хотите.
@dahiya_boy 1) name : имя, которое будет связано с данными в HTTP-заголовке Content-Disposition. 2)fileName: имя файла, которое будет связано с данными в Content-Disposition HTTP-заголовке. 3)mimeType: тип MIME, который будет связан с данными в Content-Type HTTP-заголовке. github.com/Alamofire/Alamofire/blob/…
@dahiya_boy name: ваш ключ API, например «loginName»: Dahiya ,,, fileName: — какое имя вы хотите сохранить в БД, например, name.jpg, mimeType: тип файла
Это зависит от того, что ожидает ваш сервер.