[英]How to upload image as a parameter, with other parameters using multipart form data in ios, swift3, Alamofire 4
[英]Alamofire 4 and Swift 3 Image upload with other parameters
我正在嘗試上傳帶有其他參數的圖像,當我的一個參數的數據類型為[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)")
}
})
我知道問題指南說不要求澄清,但我還沒有足夠的代表發表評論。
你是如何訪問服務器上的陣列的? 你是如何使用其他服務發送陣列的?
更重要的是,看起來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,我將數據附加到我的數組。 再次,不要忘記在關鍵字中加入[]
括號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.