Использование Alamofire и multipart / form-data

Я не могу подойти к API, который мне был предложен надлежащим образом, чтобы он дал мне ответ, который я ищу. Я использовал Swift и Alamofire некоторое время, но это первый раз, когда я загружаю изображения с использованием multipart / form-data. Я могу загружать изображения с помощью Postman, но я не могу получить такое же сообщение, отправленное по моему приложению, используя структуру Alamofire.

Мой снимок экрана Postman

Мой код Swift:

func postFulfilWish(wish_id: Int, picture : UIImage, completionHandler: ((AnyObject?, ErrorType?) -> Void)) { var urlPostFulfilWish = Constant.apiUrl; urlPostFulfilWish += "/wishes/"; urlPostFulfilWish += String(wish_id); urlPostFulfilWish += "/fulfill/images" ; let image : NSData = UIImagePNGRepresentation(UIImage(named: "location.png")!)! Alamofire.upload(.POST, urlPostFulfilWish, headers: Constant.headers, multipartFormData: { multipartFormData in multipartFormData.appendBodyPart(data: image, name: "file") }, encodingCompletion: { encodingResult in switch encodingResult { case .Success(let upload, _, _): upload.responseJSON { response in //This is where the code ends up now //So it's able to encode my message into multipart/form-data but it's not doing it in the correct way for the API to handle it debugPrint(response) } case .Failure(let encodingError): print(encodingError) } } ) } 

Если он еще не ответил, в последнее время у меня была та же проблема, что и использование Alamofire для загрузки изображения с использованием данных формы.

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

Вам нужно проверить две вещи, в первую очередь, имя файла, ожидаемого сервером, и второй метод, используемый для добавления части тела в закрытие multipartFormData.

Эти два метода не работали в моем случае –

 multipartFormData.appendBodyPart(data: imageData, name: "file") 

это ни

 multipartFormData.appendBodyPart(data: imageData, name: "file", fileName: name) 

Но на этом один работал великолепно –

 multipartFormData.appendBodyPart(data: imageData, name: "file", fileName: "file.jpeg", mimeType: "image/jpeg") 

Проблема в том, что сервер не может найти файл с ожидаемым именем.

Надеюсь, это поможет кому-то сэкономить время, задаваясь вопросом, почему он не работает.

Вы выполняете debugPrint(response) . Предположительно, вы должны сделать еще один switch response.result { ... } и посмотреть, есть ли у вас .Success или .Failure в результате запроса, и если вы добились успеха, вы бы посмотрели на содержимое объекта ответа (или если сбой, посмотрите при ошибке отказа). Вам нужно посмотреть на этот result чтобы определить, успешно ли это или нет.

 Alamofire.upload(.POST, urlPostFulfilWish, headers: Constant.headers, multipartFormData: { multipartFormData in multipartFormData.appendBodyPart(data: image, name: "file") }) { encodingResult in switch encodingResult { case .Success(let upload, _, _): upload.responseJSON { response in switch response.result { case .Success(let value): print(value) case .Failure(let error): print(error) } } case .Failure(let encodingError): print(encodingError) } } 

Я считаю, что этот вопрос устарел уже, но пока нет ответа, попробуйте следующее:

 multipartFormData.appendBodyPart(data: imageData, name: "name", fileName: "filename", mimeType: mimeType) 

Недавно я получил 404 с сервера при отправке множественного запроса вместе с параметрами в теле. Я использовал UIImagePickerController (делегат, для которого возвращает UIImage), и затем я отправил его PNG-представление.

Это произошло только для файлов, которые были JPEG на диске. Странно, что этот вопрос влияет только на множественные запросы, которые также имеют параметры в теле. Он отлично работал, когда конечная точка API не требовала ничего другого.

Я предполагаю, что в линейке JPEG -> UIImage -> PNG-представлений происходит нечто странное, что приводит к какой-то проблеме, которая, как ни странно, только проявляется в многопроцессорных запросах, которые также имеют параметры в теле. Могут быть некоторые специальные символы, которые заставляют сервер не распознавать запрос и просто возвращать 404.

Я закончил его исправлением, отправив UIImageJPEGRпредставление выбранного изображения вместо UIImagePNGRпредставления и никаких таких ошибок не было.

  • Редактирование ширины CollectionViewCell
  • Переупорядочить ячейки TableView с помощью NSFetchedResultsController Core Data - Swift 3
  • Разрешить только одному контроллеру просмотра быть в альбомной или портретной
  • Невозможно выполнить переход через Swift для цикла
  • Отрегулируйте положение UIActivityIndicatorView в AlertView - Swift
  • SandboxViolation: приложение WatchOS падает при работе на устройстве
  • Можно ли перегрузить оператор + = в Swift?
  • быстрый показ сообщений от всех пользователей Firebase
  • Swift не позволит мне использовать `! =`
  • reload view / data после завершения запроса json в iOS Swift 2.1
  • Как получить доступ к переменной экземпляра в объявлении ленивой переменной swift
  • Давайте будем гением компьютера.