Alamofire Multipart请求

时间:2017-11-28 11:58:30

标签: ios swift alamofire multipartform-data

我是快速编程的新手。我正在尝试通过alamofire进行Multipart请求.Issue是我的参数中的值之一是对象数组。我的问题是如何将对象数组附加到Multipart请求。 这是我的参数。

std::min(int(i), j);

这是我的要求

 let parameters = [
        "originguid":"63d6sd5",
        "signees":[Signess], //Here is issue "signees"is an array of objects
        "customer":"yes"
        ] as [String : Any]

将签名附加到多部分请求时,应用程序崩溃。 这是我在参数中使用的对象。

Alamofire.upload(
    .POST,
    URLString: myUrl,
    multipartFormData: { multipartFormData in

        if let img = self.imagePicked {
            multipartFormData.append(UIImageJPEGRepresentation(img, 0.2)!, withName: "fileset",fileName: "file.png", mimeType: "image/jpg")
        }
        if let file = self.filePicked{
            let fileData = try! Data(contentsOf: file)
            multipartFormData.append(fileData as Data, withName:"test.pdf", mimeType:"application/pdf")
        }

        for (key, value) in parameters {

            if key == "signees"{
                   multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
            }

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


        }

    },

    ...
)

请帮忙。提前谢谢,我浪费了两天尝试不同的事情。

3 个答案:

答案 0 :(得分:6)

与Alamofire合作

let headerDic: HTTPHeaders = [ "YOUR_HEADER_DIC" ]

let paramDic: Parameters = [ "YOUR_PARAMETER_DIC" ]

Alamofire.upload(multipartFormData: { (MultipartFormData) in

            MultipartFormData.append("YOUR_IMAGEDATA", withName: "YOUR_IMAGE_PARAMETER_NAME", fileName: "YOUR_IMAGENAME", mimeType: "image/jpeg")

            for (key, value) in paramDic {

                MultipartFormData.append(((value as AnyObject).data(using: String.Encoding.utf8.rawValue))!, withName: key)
            }

        }, to: "YOUR_WEBSERVICE_NAME", method: .post, headers: headerDic) { (result) in

            switch result {

            case .success(let upload, _, _):

                upload.responseJSON { response in

                    if let value = response.result.value {

                        let responseDic: NSDictionary = value as! NSDictionary

                             "YOUR_WEB_RESPONSE_SUCCESS_MESSEGE"

                        } else {

                            "YOUR_WEB_RESPONSE_ERROR_MESSEGE"
                        }
                    }
                }

            case .failure(let encodingError):

                var messege: String = String()

                if encodingError.localizedDescription.characters.count <= 0 {

                    messege = "Please check your Internet Conneciton!"

                } else {

                    messege = encodingError.localizedDescription
                }
                print("Error Messege:\(messege)")
            }
        }

答案 1 :(得分:0)

使用almofire

的多部分请求

数据发送到多部分

struct AGImageInfo {
    var fileName: String
    var type: String
    var data: Data
}

请求

let header: HTTPHeaders = [
    "Content-Type":"application/x-www-form-urlencoded"
]

let parameters: Parameters = [
    "someParam": "value",
    "Image": AGImageInfo(fileName: "nameOfImage.jpeg", type: "image/jpeg", data: #imageLiteral(resourceName: "TO").toData()!)
]

Alamofire.upload(multipartFormData: { (multipartFormData) in

    for (key, value) in parameters {
        if let imageData = value as? AGImageInfo {
            multipartFormData.append(imageData.data, withName: key, fileName: imageData.fileName, mimeType: imageData.type)
        }
        multipartFormData.append(((value as AnyObject).data(using: String.Encoding.utf8.rawValue))!, withName: key)
    }

}, to: "URL", method: .post, headers: header) { (result) in

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

        upload.responseJSON { response in
            switch response.result {
            case .success(let value):
                debugPrint(value)
                break

            case .failure(let error):
                debugPrint(error)
                break
            }
        }

    case .failure(let error):
        debugPrint(error)
        break
    }
}

答案 2 :(得分:0)

struct File {
    var data: Data
    var name: String
    var mimeType: String
}
.upload(
         multipartFormData: { multipartFormData in
              for (key, value) in yourDictionnary {
                    if let file = value as? File {
                        multipartFormData.append(
                                file.data,
                                withName: key,
                                fileName: file.name,
                                mimeType: file.mimeType
                        )
                    } else {
                          multipartFormData.append(
                                (value as AnyObject).data(using: String.Encoding.utf8.rawValue)!,
                                withName: key
                            )
                        }
                    }
                },
                to: "Your URL"
            )

别忘了else情况,因为您将进入if和第二个 multipart.append 中,您将得到类似这样的错误 '-[Swift._SwiftDeferredNSArray dataUsingEncoding:]:无法识别的选择器已发送到实例0x1c4421fa0'