как загрузить файл в alamofire в multiformData?

#android #swift #alamofire #multipartform-data

#Android #swift #alamofire #multipartform-данные

Вопрос:

Мне нужно загрузить изображение с составными / данными формы, которые я пробовал :

  static func uploadFile(image: UIImage?, parameters:Parameter,onResponse:@escaping(_ result:Parameter)-> (),onFailure:@escaping(_ error:Error)->()){
        
        let url = "ip address"
        let imageData = image?.jpegData(compressionQuality: 0.7)
        let headers: HTTPHeaders = [
            "Authorization": TOKEN!
        ]
  
        Alamofire.upload(multipartFormData: { (multipartFormData) in
      
            multipartFormData.append("(parameters.toJSON())".data(using: String.Encoding.utf8)!, withName: "entity")
    
            if let data = imageData{
                multipartFormData.append(data, withName: "mp3")
            }
            
        }, usingThreshold: UInt64.init(), to: url, method: .post, headers: getHeaders()) { (result) in
            
            switch result{
            case .success(let upload, _, _):
                upload.responseJSON { response in
                    print("Succesfully uploaded",response.error)
                    if let err = response.error{
                        return
                    }
                }
            case .failure(let error):
                print("Error in upload: (error.localizedDescription)")
            }
        }
        
    }
  

Мне нужно отправить модель объекта и изображение. но я должен отправить изображение в виде FormData, а не в теле.

примечание: отправка изображения с ключом «file» и класса с ключом «entity»

я не могу решить это на стороне swift….

ошибки :

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

Комментарии:

1. Вы не вызываете ни onResponse ни onFailure . Вы удалили это, пытаясь упростить свои фрагменты кода? Или вы действительно не вызываете эти замыкания? Проблема в том, что сетевой запрос не выполняется или что вы просто не вызывали замыкания.

2. Наконец, если вы не уверены на 100%, что запрос правильный, я бы посоветовал такие инструменты, как Charles или WireShark , чтобы просмотреть запрос и убедиться, что он правильно сформирован. Например. интерполяция строк parameters.toJSON() может легко вызвать проблему, если, например, if toJSON уже возвращено a Data . Мы не можем комментировать это, не видя сигнатуру метода toJSON

3. спасибо, Роб, что ответил мне. я поместил содержимое своей консоли в свой пост. проверьте это, но в нем нет четких данных. у меня есть case .success и case . сбой не так ли? сетевой запрос выполнен успешно.

4. позвольте мне объяснить вам больше. на стороне сервера мне нужен класс с именем ключа «entity» в теле запроса и изображение с именем ключа: «file». Выполнено. как вы это делаете?

5. Наконец-то… У меня было две проблемы. 1. добавление файла с ключом и именем файла является правильным, я забыл имя файла. 2. параметр. toJSON() неверен. toJSONString() верен. роб опубликует эти советы, я проголосую за вас. Спасибо

Ответ №1:

сначала прочитайте комментарии.

не забудьте добавить имя файла, даже если вы установили его за один шаг до загрузки файла.

попробуйте использовать toJSONString() вместо toJSON()