Отправить изображение с определенными параметрами?

У меня нет проблем с отправкой обычного текста.

Например, у меня есть такой запрос:

func buyWholeSaler(url : String, token:String, manager:String, fio:String,phone:String, sender:String, carrier:String, document:String,shipping_id:String,pay_type:String, shipping_pay:String, amount_nalogi:String, shipping_return:String,money_recipient :String,comment:String, completion: @escaping (JSON)-> Void) {
        let headers: HTTPHeaders = [
            "Authorization": "Bearer \(token)",
            "Accept": "application/json"
        ]

        let parameters: Parameters = [
            "shipping_id" : shipping_id,
            "pay_type": pay_type,
            "manager" : manager,
            "fio" : fio,
            "phone" : phone,
            "sender" : sender,
            "carrier" : carrier,
            "document" : document,
            "shipping_pay": shipping_pay,
            "amount_nalogi": amount_nalogi,
            "shipping_return" :shipping_return,
            "money_recipient" : money_recipient,
            "comment" : comment
        ]
        AF.request(url,method: .post, parameters: parameters, headers:headers).responseJSON { response in
            switch response.result {
            case .success(let value):
                let json = JSON(value)
                completion(json)
            case .failure(let error):
                print(error)
            }
        }
    }

Но как отправить картинку с такими параметрами?

у меня 2 картинки

var image1 = UIImage()
var image2 = UIImage()

Как я могу переписать запрос, чтобы отправить его правильно? Например:

let parameters: Parameters = [
            "shipping_id" : shipping_id,
            "pay_type": pay_type,
            ...
            "ur_file_pdv": image1,
            "ur_file_er": image1
        ]

Я нашел этот запрос, но я не могу понять, как он работает:

AF.upload(multipartFormData: { multiPart in
                        for p in parameters {
                            multiPart.append("\(p.value)".data(using: String.Encoding.utf8)!, withName: p.key)
                        }
                        multiPart.append(imageVityagPdv.jpegData(compressionQuality: 0.4)!, withName: "ur_file_pdv", fileName: "ur_file_pdv.jpg", mimeType: "image/jpg")
                        multiPart.append(imageVityag.jpegData(compressionQuality: 0.4)!, withName: "ur_file_er", fileName: "ur_file_er.jpg", mimeType: "image/jpg")
                    }, to: url, method: .post, headers: headers) .uploadProgress(queue: .main, closure: { progress in
                        print("Upload Progress: \(progress.fractionCompleted)")
                    }).responseJSON(completionHandler: { data in
                        print("upload finished: \(data)")
                        let success = json["success"].stringValue
                    }).response { (response) in
                        switch response.result {
                        case .success(let resut):
                            print("upload success result: \(resut!)")
 case .failure(let err):
                            print("upload err: \(err)")
                        }
                    }

Вроде что-то заливает на сервер но заказ не происходит


person user11698120    schedule 14.09.2019    source источник
comment
Что значит приказ не выполняется? Последний блок кода должен отлично работать для того, что вы хотите сделать. Вы добавляете свои параметры и свои изображения (в виде данных) к запросу, а затем отправляете его в виде .post.   -  person unixb0y    schedule 14.09.2019
comment
@unixb0y в первом случае я получаю ответ json, если с моего сервера все в порядке, или какие-то ошибки, например пустое поле. Во втором случае я только что получил upload success result: \(resut!), что-нибудь о пустых полях, что-нибудь с моего сервера   -  person user11698120    schedule 14.09.2019


Ответы (2)


Вы не можете добавить «Данные» в качестве параметра, тем более что «запрос» делается для получения данных с сервера и должен быть довольно небольшим, просто предоставляя серверу информацию о том, что вы действительно хотите получить от него (в текстовом виде ). Чтобы что-то загрузить, вы используете запрос POST, который вы можете сделать в Alamofire с помощью AF.upload, как показано ниже.

Что вы подразумеваете под "заказ не происходит"? Может быть, у вас есть код сервера, чтобы мы могли понять, в чем проблема? Возможно, ему нужны параметры как GET, в этом случае вы можете добавить их непосредственно в URL-адрес.

func buyWholeSaler(url : String, token: String, manager: String,
    fio: String, phone: String, sender: String, carrier: String,
    document: String, shipping_id: String, pay_type: String,
    shipping_pay: String, amount_nalogi: String,
    shipping_return: String, money_recipient: String, comment:String,
    completion: @escaping (JSON) -> Void) {

    let headers: HTTPHeaders = [
        "Authorization": "Bearer \(token)",
        "Accept": "application/json"
    ]

    let parameters: Parameters = [
        "shipping_id" : shipping_id,
        "pay_type": pay_type,
        "manager" : manager,
        "fio" : fio,
        "phone" : phone,
        "sender" : sender,
        "carrier" : carrier,
        "document" : document,
        "shipping_pay": shipping_pay,
        "amount_nalogi": amount_nalogi,
        "shipping_return" :shipping_return,
        "money_recipient" : money_recipient,
        "comment" : comment
    ]

    AF.upload(multipartFormData: { (multipartFormData) in
        parameters.forEach({ multipartFormData.append("\(p.value)".data(using: .utf8)!, withName: p.key) })
        multipartFormData.append(image1.jpegData(compressionQuality: 0.4)!,
            withName: "ur_file_pdv", fileName: "ur_file_pdv.jpg", mimeType: "image/jpg")
        multipartFormData.append(image2.jpegData(compressionQuality: 0.4)!,
            withName: "ur_file_er", fileName: "ur_file_er.jpg", mimeType: "image/jpg")
    },
    to: url, method: .post, headers : headers).responseJSON { (response) in
        switch response.result {
        case .success(let value): completion(JSON(value))
        case .failure(let error): print(error)
        }
    }
}
person unixb0y    schedule 14.09.2019

   self.uploadMultipart(buildedWith: { (multipartData) in
        multipartData.append(assestPath, withName: "file", fileName: "mp4", mimeType: "")

путь assest будет URL-адресом изображения, это должен быть локальный путь, или вы также можете преобразовать в форму данных, но это будет лучше напрямую добавить путь.

person manish singh    schedule 14.09.2019