如何使用Alamofire在多部分表单数据中追加数组? [英] How to append array in multipart form data with Alamofire?

查看:101
本文介绍了如何使用Alamofire在多部分表单数据中追加数组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Alamofire上传包含多部分表单数据的图像,但是在传递数组作为参数时遇到了一些问题.

I am uploading image with multipart form data using Alamofire but getting some problem while i am passing an array as parameter.

根据请求,我需要将所有数据传递给letter. 这是我的工作方式.

As per request i need to pass all data into letter. Here is how i am doing.

    let data = try! JSONSerialization.data(withJSONObject: arrSelectedRecipientsID, options: .prettyPrinted)
    let jsonString = String(data: data, encoding: .utf8)!

    let paramArr : [String : Any] = [
        "message" : txtvwMessage.text!,
        "status": "draft",
        "recipient_ids": jsonString
    ]

    let parameter  : [String : Any] = ["letter" : paramArr]

    let accesstoken = Utilities.retriveValueFromDefault(forKey: UDKey.kUserAuthentication_Token) as String
    let client = Utilities.retriveValueFromDefault(forKey: UDKey.kUserClient) as String
    let uid = Utilities.retriveValueFromDefault(forKey: UDKey.kUserUID) as String


    let headersInfo : HTTPHeaders = [ "Content-Type" : "multipart/form-data",
                                      "Accept" : "application/json",
                                      "access-token" : accesstoken,
                                      "client" : client,
                                      "uid" : uid
    ]


    fileUploadWithParameter(Constant.ServerAPI.kPostLetters, images: letterImage, header: headersInfo, parameters: parameter, success: { (response) in

        print(response)
    }) { (progress) in


    }

这是Alamofire请求方法.

Here is Alamofire request method.

func fileUploadWithParameter(_ url: String,images:NSMutableArray,header : [String : String], parameters: [String:Any], success:@escaping (NSDictionary)->(),progressHandler:@escaping(_ progress: Double)->Void) {

    Alamofire.upload(multipartFormData: { multipartFormData in
        for i in 0..<images.count {

            let rotatedImage = images[i] as! UIImage

            if let imgData = UIImageJPEGRepresentation(rotatedImage, 0.8) {
                multipartFormData.append(imgData, withName: "letter[photos]",fileName: "0\(i).jpg", mimeType: "image/jpg")
            }
        }
        for (key, value) in parameters {

            //multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key )
            let paramsData:Data = NSKeyedArchiver.archivedData(withRootObject: value)
            multipartFormData.append(paramsData, withName: key)

        }

    }, to: url,
       method:.post,
       headers:header) { (result) in
        print("\n\n\nRequest URL :- \(url)\nParameters :- \(parameters)")
        switch result {
        case .success(let upload, _, _):

            upload.responseJSON { response in

                if response.error != nil {
                    print("Error :- \((response.error?.localizedDescription)!)\n\n\n")
                }
                if let jsonDict = response.result.value as? NSDictionary {
                    print("Response :- \(jsonDict)\n\n\n")

                } else {
                    print("Error :- \(Constant.ErrorMessage.kCommanError)\n\n\n")

                }
            }
        case .failure(let encodingError):
            print("Error :- \(encodingError.localizedDescription)\n\n\n")

        }

    }
}

邮递员工作得很好,所以有人可以在我做错事的地方帮我.

Postman works well so can someone please help me where i am doing wrong.

期望使用API​​,正确的json应该是

API expected The proper json should be

 {
   "letter":
          {
            "message": "Type your message here...!!!",
            "recipient_ids": [183, 184],
            "status": "draft"
          }
 }

API在红宝石中运行,它说我正在发送字符串.请帮助我找出问题所在.

API is in ruby on rails and it says i am sending string. Please help me to find out what is issue.

推荐答案

最后,通过在请求中添加单独的附件来完成此任务.这是如何以多部分形式的数据请求传递数组.

Finally get it done with separate append in request. Here is how you can pass an array in multipart form data request.

Alamofire.upload(multipartFormData: { multipartFormData in
        for i in 0..<self.letterImage.count {

            let rotatedImage = self.letterImage[i] as! UIImage

            if let imgData = UIImageJPEGRepresentation(rotatedImage, 0.8) {
                multipartFormData.append(imgData, withName: "letter[photos][]",fileName: "0\(i).jpg", mimeType: "image/jpg")
            }

        }

        multipartFormData.append("\(message)".data(using: String.Encoding.utf8)!, withName: "letter[message]")
        multipartFormData.append("draft".data(using: String.Encoding.utf8)!, withName: "letter[status]")

        for (_,value) in self.arrSelectedRecipientsID.enumerated() {

            multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: "letter[recipient_ids][]")
        }

    }

这篇关于如何使用Alamofire在多部分表单数据中追加数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆