【问题标题】:Alamofire: how to append a json array parameter in a multipart form data?Alamofire:如何在多部分表单数据中附加 json 数组参数?
【发布时间】:2017-09-21 23:41:20
【问题描述】:

我正在尝试发送带有参数的照片,但问题是我想将 JSON 数组发送到服务器。似乎 Alamofire 没有发送Data 列表的方法,那么还有什么好的替代方法呢?

问题的关键部分是:

var encodedTags: [Data] = tags.map({ return $0.data(using: .utf8)!})
            mpd.append(encodedTags, withName: key)

在此上传调用中:

let parameters: [String: Any] = ["username": "TheCooliest", ..., "tags": ["KoolKid", "TheKooliest", "BetterThanKimK"]    
...

upload(multipartFormData: { (mpd) in
        mpd.append(url, withName: "file", fileName: "weeknd.jpg")
        for (key, value) in parameters {
            if let tags = value as? [String], key == "tags" {
                var encodedTags = tags.map({ return $0.data(using: .utf8)!})
                mpd.append(encodedTags, withName: key)

            }
        }
    }

【问题讨论】:

    标签: ios alamofire multipartform-data


    【解决方案1】:

    我有同样的情况,你必须将你的数组转换为字符串,然后编码和上传。 在我的情况下,我必须加密数组并发送到服务器,然后服务器解密数组。

    var encodedTags = tags.map({ return $0})
     //write logic to convert array to string
     mpd.append(encodedTags.data(using: .utf8)!, withName: key)
    

    【讨论】:

      【解决方案2】:

      这是 Multipart 请求的答案,请查看代码。

      Alamofire.upload(multipartFormData:{ multipartFormData in
              let firstNameTxt = self.firstNmae.text!.data(using: .utf8)
              multipartFormData.append(firstNameTxt!, withName: "first_name", mimeType: "text/plain")
          },
                           usingThreshold:UInt64.init(), to:AppConstant.GlobalConstants.updateProfile, method:.post, headers:["Authorization": "auth_token"],encodingCompletion: { encodingResult in
                              switch encodingResult {
                              case .success(let upload, _, _):
                                  upload.responseJSON { response in
                                      debugPrint(response)
                                  }
                              case .failure(let encodingError):
                                  print(encodingError)
                              }
          })
      

      【讨论】:

        【解决方案3】:

        好的,所以我使用了JSONSerialization。它将我的列表转换为 Any 对象,我将其转换为数据。

        for (key, value) in parameters {
            if let tags = value as? [String], key == "tags" {
        
                do {
                    let json = try JSONSerialization.data(withJSONObject: tags, options: .prettyPrinted)
                    mpd.append(json as Data, withName: key)
                } catch {}
        
            }
        

        【讨论】:

          【解决方案4】:

          如果你想用 Swift 4 做到这一点,你可以使用新的 JSONEncoder。 您可以执行以下操作来使用多部分表单数据上传文件和 JSON 参数:

          let image = UIImage(named: "test")
          let png = UIImagePNGRepresentation(image!)!
          
          let arr = ["str1", "str2"]
          let jsonArr = try? JSONEncoder().encode(arr)
          
          Alamofire.upload(multipartFormData: { (multiPart) in
              multiPart.append(png, withName: "file", fileName: "aaa.png", mimeType: "image/png")
          
              if let jsonArr = jsonArr {
                  multiPart.append(jsonArr, withName: "pictures")
              }
          }, to: URL) { (result) in
          }
          

          【讨论】:

            猜你喜欢
            • 2018-12-18
            • 1970-01-01
            • 1970-01-01
            • 2020-09-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-20
            • 1970-01-01
            相关资源
            最近更新 更多