Alamofire 4和Swift 3 Image上传其他参数

我正在尝试上传带有其他参数的图像,当我的一个参数的数据类型为[String]时,会出现问题。 服务器端的数组将为空。:/使用其他数据类型一切正常。

self.manager.upload( multipartFormData: { multipartFormData in multipartFormData.append(imgData, withName: imgKey, fileName: "image.jpg", mimeType: "image/jpg") for (key, value) in params { multipartFormData.append(serialize(value)!, withName: key) } }, to: path, encodingCompletion: { encodingResult in switch encodingResult { case .success(let upload, _, _): upload.responseJSON { response in debugPrint("SUCCESS RESPONSE: \(response)") } case .failure(let encodingError): print("ERROR RESPONSE: \(encodingError)") } } ) func serialize(_ value: Any) -> Data? { if JSONSerialization.isValidJSONObject(value) { return try? JSONSerialization.data(withJSONObject: value, options: []) } else { return String(describing: value).data(using: .utf8) } } 

我的参数是[String: Any]

我做错了什么? 🙁

问题肯定在客户端。 当我使用Postman或其他HTTP服务时,一切正常

 Alamofire.upload(multipartFormData: { multipartFormData in var index = 1 for image in imageArray { let imageData: Data = (UIImageJPEGRepresentation(image, 1.0) as Data?)! multipartFormData.append(imageData, withName: "home-\(index)", fileName: "home-\(index)", mimeType: "image/jpeg") index += 1 } }, with: requestName, encodingCompletion: { result in switch result { case .success(let upload, _, _): upload.responseJSON { response in print("Image(s) Uploaded successfully:\(response)") } case .failure(let encodingError): print("encodingError:\(encodingError)") } }) 

我知道问题指南说不要求澄清,但我还没有足够的代表发表评论。

你是如何访问服务器上的arrays的? 你是如何使用其他服务发送arrays的?

更重要的是,看起来params[String:String] 。 你如何为它添加[String]值? 你在序列化吗?

我使用这段代码上传了我想要的图片和参数,我希望它有所帮助

 Alamofire.upload(multipartFormData: { (MultipartFormData) in var secondCounter = 0 for data in imageDataArray { print(imageNamesArray[secondCounter]) MultipartFormData.append(data, withName: imageNamesArray[secondCounter], fileName: imageNamesArray[secondCounter] + "myImage.png", mimeType: "application/octed-stream") secondCounter = secondCounter + 1 } contentDict = parameters as! [String : String] for (key, value) in contentDict { MultipartFormData.append(value.data(using: .utf8)!, withName: key) } }, to: url, method: .post, headers: nil, encodingCompletion: { (result) in switch result { case .success(let upload, _, _): upload.responseJSON(completionHandler: { (dataResponse) in if dataResponse.result.error != nil { completion(nil, nil, dataResponse.result.error as? NSError, false) } else { print(dataResponse.result.value) completion(nil, nil, nil, true) } }) case .failure(let encodingError): print(encodingError) completion(nil, nil, nil, false) } 

忽略打印​​Lol

这对我来说是正确的。 解决方案非常简单,因为您使用MultipartFormData上传需要查看RFC 2388的文件 。 要上传数组,您需要这种非常重要的格式。 例如,如果要上传字符串数组,则需要在键中包含括号!

 Value: "234234" Key: keyname[] 

您需要一次又一次地将数据附加到循环中。

例如,使用Alamofire查看这个快速代码。

 for (key, value) in params { if JSONSerialization.isValidJSONObject(value) { let array = value as! [String] for string in array { if let stringData = string.data(using: .utf8) { multipartFormData.append(stringData, withName: key+"[]") } } } else { multipartFormData.append(String(describing: value).data(using: .utf8)!, withName: key) } } 

如果变量是有效的JSONObject,我将数据附加到我的数组。 再次,不要忘记在关键字中加入[]括号。