Загрузка данных формы из нескольких частей с несколькими изображениями параметрами (Alamofire 5.2)

#swift #alamofire

#swift #alamofire

Вопрос:

Я пытаюсь загрузить несколько изображений и параметров на сервер, используя «Alamofire 5.2)», это то, что ожидает сервер

 [{"key":"media1","description":"","type":"file","value":["/C:/Users/x/x/x/x.jpg"]},
[{"key":"media2","description":"","type":"file","value":["/C:/Users/x/x/x/x.jpg"]},
[{"key":"media3","description":"","type":"file","value":["/C:/Users/x/x/x/x.jpg"]},

{"key":"model","value":"{"emp_Id": "6","device_Identifier":"Device 01","timestamp":"123,”description”:”description",”handoverStatus”:”false”}","type":"text"}]

//Please note the array part
  

Вот как я добавляю выбранное изображение в массив изображений

 var dictImage : [UIImage]?

if pickedImage.pngData() != nil
{
  dictImage!.append(pickedImage)
}

  

Вот как я пытаюсь вызвать загрузку alamofire

 func xyz()
{
        let param : [String: Any] = [
            "emp_Id" : "",
            "device_Identifier" : "",
            "timestamp" : "",
            "description" : "",
            "handoverStatus" : ""
        ]
    let urlString = URL(string: APIDetails.BaseUrl   "api/123")!
    let url = (try? URLRequest(url: urlString, method: .post, headers: APIDetails.header))!
    AF.upload(multipartFormData: { (multipartData) in
        
        let img1 = arrImage![0]
        let img2 = arrImage![1]
        let img3 = arrImage![2]

        multipartData.append(img1.pngData(), withName:"media1", fileName: "(Date().timeIntervalSince1970).jpg", mimeType: "file")
        multipartData.append(img2.pngData(), withName:"media2", fileName: "(Date().timeIntervalSince1970).jpg", mimeType: "file")
        multipartData.append(img3.pngData(), withName:"media3", fileName: "(Date().timeIntervalSince1970).jpg", mimeType: "file")
            
        
        for (key, value) in param {
            multipartData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
        }

    }, with: url)
}


  

Как мне загрузить каждое изображение и его детали в виде словаря?

Как мне добавить ход загрузки и результат, который показывает, что что-то не удалось или нет?

Я пытался с

 
}, with: url,encodingCompletion:{
        EncodingResult in
        switch EncodingResult{
        case .success(let upload, _, _):
            upload.responseJSON { response in
                debugPrint("SUCCESS RESPONSE: (response)")
            }
        case .failure(let encodingError):

            print("ERROR RESPONSE: (encodingError)")

        }        })
  

Но это выдает ошибку Extra argument 'encodingCompletion' in call

(Это моя первая попытка загрузить данные составной формы, код / его часть были взяты из другого ответа)

Ответ №1:

попробуйте этот код, я не тестировал в Alamofire (5.2)

 let baseUrl = "your URL"
    let fullUrl = baseUrl   strUrl
    var headers : HTTPHeaders = HTTPHeaders(["Content-type" : "multipart/form-data"])
    if let header = header{
        headers = header
    }
    
    guard let url = try? URLRequest(url: fullUrl, method: .post, headers: headers) else {return}
    AF.upload(multipartFormData: { (multipartData) in
        
        for i in 0 ..< arrImage.count{
            if let imageData = arrImage[i].pngData(){
                let mediaName = "media(i   1)"
                multipartData.append(imageData, withName:mediaName, fileName: "(Date().timeIntervalSince1970).jpg", mimeType: "file")
            }
        }
      for (key, value) in parameter {
            multipartData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
        }
    }, to: url).responseJSON(queue: .main, options: .allowFragments) { (response) in
        switch response.result{
        case .success(let value):
            print("Json: (value)")
        case .failure(let error):
            print("Error: (error.localizedDescription)")
        }
    }.uploadProgress { (progress) in
        print("Progress: (progress.fractionCompleted)")
    }
  

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

1. Что делает if let header = header{ заголовки = заголовок } ? Также в нем говорится: «Не удается найти заголовок » в области видимости»

2. Заголовки @Zyfe3r, добавленные в URLRequest, содержат информацию, токен и метаданные, необходимые для запроса и ответа API.

3. я понял это. Но почему-то ничего не работает, я продолжаю получать ошибки от серверной части о каком-то исключении. Но то же самое отлично работает на Android!

4. @Zyfe3r поделитесь ошибкой и вашим кодом, без которого я не могу разобраться, и этот код работает для меня