Alamofire multipartFormData с использованием параметров [String: Any] - PullRequest
0 голосов
/ 18 марта 2020

Здравствуйте. Я пытаюсь опубликовать параметр и / или изображение. Мой параметр [String: Any] со строкой, датой, int, значениями. Когда я публикую только параметр, я использую кодировку URLEncoding.default. Однако, когда мне нужно опубликовать как параметр, так и изображение, я использую multipartFormData. Мой код ниже

if url == ""{

            AF.upload(multipartFormData: { multipartFormData in
                for (key,value) in parameters {
                    multipartFormData.append((value as! String).data(using: .utf8)!, withName: key)
                }

                let jpegData = art!.jpegData(compressionQuality: 1.0)
                multipartFormData.append(Data((jpegData)!), withName: "photo")

            }, to: "\(NetworkManager.rootURL)/api/add/")
                .responseJSON { response in
                    debugPrint(response)
            }
        }else{
            AF.request("\(NetworkManager.rootURL)/api/add/", method: .post, parameters: parameters, encoding: URLEncoding.default, headers: nil).response { (reponse) in
                let status = reponse.response!.statusCode
                if status == 200{
                    completion(200)
                }else{
                    completion(401)
                }
            }
        }

Моя проблема в том, что, поскольку мой параметр имеет значение any со строковыми значениями типа int, я получаю Could not cast value of type 'Swift.Int' (0x1c3f1f1e8) to 'Swift.String' (0x1c3f21390). Есть ли обходной путь для этого? или я должен изменить все на строку ...

Любая помощь приветствуется

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

Я сделал функцию блокировки блока для загрузки изображения с параметром на сервер, используя Multipart

//Here strUrl = YOUR WEBSERVICE URL
//postParam = post Request parameter i.e. 
//let postParam : [String : Any] = [first_name : "name"]
//imageArray = image upload array i.e.
//var imageArray : [[String:Data]] = [["image_name" : YOUR IMAGE DATA]]

func postImageRequestWithURL(withUrl strURL: String,withParam postParam: Dictionary<String, Any>,withImages imageArray:[[String:Data]], completion:@escaping (_ isSuccess: Bool, _ response:NSDictionary) -> Void)
{
   let requetURL = strURL

   Alamofire.upload(multipartFormData: { (MultipartFormData) in

    for (imageDic) in imageArray
    {
        for (key,value) in imageDic
        {
            MultipartFormData.append(value, withName:key,fileName: "file.jpg", mimeType: "image/jpg")
        }
    }

    for (key, value) in postParam
    {
        MultipartFormData.append("\(value)".data(using: .utf8)!, withName: key)

      // MultipartFormData.append(value, withName: key)
    }

}, usingThreshold: UInt64.init(), to: requetURL, method: .post, headers: ["Accept": "application/json"]) { (result) in

    switch result {
    case .success(let upload, _, _):

        upload.uploadProgress(closure: { (progress) in
            print("Upload Progress: \(progress.fractionCompleted)")
        })

        upload.responseJSON { response in

            let desiredString = NSString(data: response.data!, encoding: String.Encoding.utf8.rawValue)

            print("Response ====================")

            print(desiredString!)

            if let json = response.result.value as? NSDictionary
            {
                if response.response?.statusCode == 200
                    || response.response?.statusCode == 201
                    || response.response?.statusCode == 202
                {
                    completion(true,json);
                }
                else
                {
                    completion(false,json);
                }
            }
            else
            {
                completion(false,[:]);
            }
        }

    case .failure(let encodingError):
        print(encodingError)

        completion(false,[:]);
    }

  }
}

Вы также можете загрузить несколько изображений, используя это. Надеюсь, это поможет ...

0 голосов
/ 18 марта 2020

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

for (key, value) in parameters {
   multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
}
...