2016-12-07 3 views
1

Я пытаюсь загрузить изображение с другими параметрами, проблема возникает, когда мой один из моих параметров имеет тип данных [String]. Массив будет пустым на стороне сервера .:/ С другими типами данных все работает хорошо.Alamofire 4 и Swift 3 Загрузка изображения другими параметрами

self.manager.upload(
      multipartFormData: { multipartFormData in 
       multipartFormData.append(imgData, withName: imgKey, fileName: "image.jpg", mimeType: "image/jpg") 

       for (key, value) in params { 
        multipartFormData.append(serialize(value)!, withName: key) 
       } 

      }, 
      to: path, 
      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)") 

       } 
      } 
     ) 

func serialize(_ value: Any) -> Data? { 
     if JSONSerialization.isValidJSONObject(value) { 
      return try? JSONSerialization.data(withJSONObject: value, options: []) 
     } 
     else { 
      return String(describing: value).data(using: .utf8) 
     } 
    } 

Мой Params является [String: Any]

Что я точно делаю неправильно? :(

проблема это определенно на стороне клиента. Все работает отлично, когда я использую Почтальон или другие HTTP Services

+0

Поделитесь ссылкой со своим почтовым скриншотом, позвольте мне взглянуть –

ответ

2
Alamofire.upload(multipartFormData: { multipartFormData in 
    var index = 1 
    for image in imageArray { 
     let imageData: Data = (UIImageJPEGRepresentation(image, 1.0) as Data?)! 

     multipartFormData.append(imageData, withName: "home-\(index)", fileName: "home-\(index)", mimeType: "image/jpeg") 

     index += 1 
    } 
    }, with: requestName, encodingCompletion: { result in 
     switch result { 
     case .success(let upload, _, _): 

      upload.responseJSON { response in 
       print("Image(s) Uploaded successfully:\(response)") 
      } 
     case .failure(let encodingError): 
      print("encodingError:\(encodingError)") 
     } 
}) 
0

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

Alamofire.upload(multipartFormData: { (MultipartFormData) in 
      var secondCounter = 0 
      for data in imageDataArray { 
       print(imageNamesArray[secondCounter]) 
       MultipartFormData.append(data, withName: imageNamesArray[secondCounter], fileName: imageNamesArray[secondCounter] + "myImage.png", mimeType: "application/octed-stream") 
       secondCounter = secondCounter + 1 
      } 
      contentDict = parameters as! [String : String] 
      for (key, value) in contentDict { 
       MultipartFormData.append(value.data(using: .utf8)!, withName: key) 
      } 
      }, to: url, method: .post, headers: nil, encodingCompletion: { (result) in 
       switch result { 
       case .success(let upload, _, _): 
        upload.responseJSON(completionHandler: { (dataResponse) in 
         if dataResponse.result.error != nil { 
          completion(nil, nil, dataResponse.result.error as? NSError, false) 
         } 
         else { 
          print(dataResponse.result.value) 
          completion(nil, nil, nil, true) 
         } 
        }) 
       case .failure(let encodingError): 
        print(encodingError) 
        completion(nil, nil, nil, false) 
       } 

Игнорировать отпечатки Лол

+0

Имеются ли ваши параметры, содержащие массивы? – BilalReffas

+0

Да, в этом приложении я загружаю 12 изображений и 4 массива –

+0

Как это возможно, ваши параметры имеют тип данных [String: String] – BilalReffas

1

Я знаю принципы вопрос сказать не просить разъяснений, но я не хватает респ комментировать еще.

Как вы получаете доступ к массиву на сервере? Как вы отправили массив с другими службами?

Что еще более важно, это выглядит как params является [String:String]. Как вы добавляете значение [String]? Вы его сериализуете?

+0

Мои параметры [String: Any] и да, я покажу это ниже и обновите мой ответ, как я его сериализую. – BilalReffas

+0

@BilalReffas Он по-прежнему не работает с обновленным методом сериализации? Просто от чтения документов, которые выглядят отлично от меня. Я бы использовал некоторые точки останова/ведения журнала, чтобы убедиться, что метод 'JSONSerialization.isValidJSONObject' возвращает true для массива. –

+0

Да, он все еще не работает. – BilalReffas

0

Это работает для меня правильно знаю. Решение очень просто, поскольку вы используете MultipartFormData для загрузки файлов, которые вам нужны, чтобы взглянуть на RFC 2388. Чтобы загрузить массив, вам нужен этот формат, который действительно важен. Например, если вы хотите загрузить массив строк, вам нужно включить скобки в свой ключ !!!

Value: "234234" Key: keyname[] 

Необходимо добавить данные в цикл снова и снова.

Например, посмотрите этот быстрый код, используя Alamofire.

for (key, value) in params { 
      if JSONSerialization.isValidJSONObject(value) { 
       let array = value as! [String] 

       for string in array { 
        if let stringData = string.data(using: .utf8) { 
         multipartFormData.append(stringData, withName: key+"[]") 
        } 
       } 

      } else { 
       multipartFormData.append(String(describing: value).data(using: .utf8)!, withName: key) 
      } 
     } 

Если переменная является допустимым JSONObject, я добавляю данные в свой массив. Не забудьте также добавить к вашему ключевому слову скобки [].

Смежные вопросы