使用 Alamofire 和 multipart/form-data
Using Alamofire and multipart/form-data
我无法以正确的方式接近提供给我的 API 以得到我正在寻找的响应。我已经使用 Swift 和 Alamofire 一段时间了,但这是我第一次使用 multipart/form-data 上传图片。我可以使用 Postman 上传图像,但无法使用 Alamofire 框架让我的应用程序发送相同的消息。
我的Swift代码:
func postFulfilWish(wish_id: Int, picture : UIImage, completionHandler: ((AnyObject?, ErrorType?) -> Void)) {
var urlPostFulfilWish = Constant.apiUrl;
urlPostFulfilWish += "/wishes/";
urlPostFulfilWish += String(wish_id);
urlPostFulfilWish += "/fulfill/images" ;
let image : NSData = UIImagePNGRepresentation(UIImage(named: "location.png")!)!
Alamofire.upload(.POST, urlPostFulfilWish, headers: Constant.headers, multipartFormData: { multipartFormData in
multipartFormData.appendBodyPart(data: image, name: "file")
},
encodingCompletion: { encodingResult in
switch encodingResult {
case .Success(let upload, _, _):
upload.responseJSON { response in
//This is where the code ends up now
//So it's able to encode my message into multipart/form-data but it's not doing it in the correct way for the API to handle it
debugPrint(response)
}
case .Failure(let encodingError):
print(encodingError)
}
}
)
}
您正在做 debugPrint(response)
。你大概应该做另一个 switch response.result { ... }
并看看你是否得到 .Success
或 .Failure
作为请求的结果,如果成功,你会查看响应对象的内容(或者如果失败,看失败报错)。您需要查看那个 result
来诊断它是否成功。
Alamofire.upload(.POST, urlPostFulfilWish, headers: Constant.headers, multipartFormData: { multipartFormData in
multipartFormData.appendBodyPart(data: image, name: "file")
}) { encodingResult in
switch encodingResult {
case .Success(let upload, _, _):
upload.responseJSON { response in
switch response.result {
case .Success(let value):
print(value)
case .Failure(let error):
print(error)
}
}
case .Failure(let encodingError):
print(encodingError)
}
}
如果还没有回答,最近我在使用 Alamofire 使用表单数据上传图像时遇到了同样的问题。
我能够使用 Postman 完全按照此 post 中显示的方式上传图像,但无法在我的应用程序中使用 Alamofire 进行上传。
您需要检查两件事,首先是服务器期望的文件名,其次是用于在 multipartFormData 闭包中附加正文部分的方法。
这两种方法在我的情况下不起作用 -
multipartFormData.appendBodyPart(data: imageData, name: "file")
这一个都不是
multipartFormData.appendBodyPart(data: imageData, name: "file", fileName: name)
但在这方面工作出色 -
multipartFormData.appendBodyPart(data: imageData, name: "file", fileName: "file.jpeg", mimeType: "image/jpeg")
问题基本上是服务器找不到具有预期名称的文件。
我希望这可以帮助人们节省时间来思考为什么它不起作用。
我认为这个问题已经过时了,但只要没有被接受的答案,请尝试以下操作:
multipartFormData.appendBodyPart(data: imageData, name: "name", fileName: "filename", mimeType: mimeType)
我最近在 body 中发布带有参数的多部分请求时从服务器收到了 404。我使用的是 UIImagePickerController(return 是一个 UIImage 的委托),然后我发送了它的 PNG 表示。
这只发生在磁盘上的 JPEG 文件中。奇怪的是,这个问题似乎只影响在 body 中也有参数的多部分请求。当 API 端点不需要任何其他东西时,它工作正常。
我的猜测是,在 JPEG -> UIImage -> PNG 表示形式中发生了一些奇怪的事情,导致了某种问题,奇怪的是,这些问题似乎只出现在多部分请求中,这些请求也有参数body。可能有一些特殊字符使服务器无法识别请求,只是 return 404.
我最终通过发送所选图像的 UIImageJPEGRepresentation 而不是 UIImagePNGRepresentation 来修复它,并且没有出现此类错误。
我无法以正确的方式接近提供给我的 API 以得到我正在寻找的响应。我已经使用 Swift 和 Alamofire 一段时间了,但这是我第一次使用 multipart/form-data 上传图片。我可以使用 Postman 上传图像,但无法使用 Alamofire 框架让我的应用程序发送相同的消息。
我的Swift代码:
func postFulfilWish(wish_id: Int, picture : UIImage, completionHandler: ((AnyObject?, ErrorType?) -> Void)) {
var urlPostFulfilWish = Constant.apiUrl;
urlPostFulfilWish += "/wishes/";
urlPostFulfilWish += String(wish_id);
urlPostFulfilWish += "/fulfill/images" ;
let image : NSData = UIImagePNGRepresentation(UIImage(named: "location.png")!)!
Alamofire.upload(.POST, urlPostFulfilWish, headers: Constant.headers, multipartFormData: { multipartFormData in
multipartFormData.appendBodyPart(data: image, name: "file")
},
encodingCompletion: { encodingResult in
switch encodingResult {
case .Success(let upload, _, _):
upload.responseJSON { response in
//This is where the code ends up now
//So it's able to encode my message into multipart/form-data but it's not doing it in the correct way for the API to handle it
debugPrint(response)
}
case .Failure(let encodingError):
print(encodingError)
}
}
)
}
您正在做 debugPrint(response)
。你大概应该做另一个 switch response.result { ... }
并看看你是否得到 .Success
或 .Failure
作为请求的结果,如果成功,你会查看响应对象的内容(或者如果失败,看失败报错)。您需要查看那个 result
来诊断它是否成功。
Alamofire.upload(.POST, urlPostFulfilWish, headers: Constant.headers, multipartFormData: { multipartFormData in
multipartFormData.appendBodyPart(data: image, name: "file")
}) { encodingResult in
switch encodingResult {
case .Success(let upload, _, _):
upload.responseJSON { response in
switch response.result {
case .Success(let value):
print(value)
case .Failure(let error):
print(error)
}
}
case .Failure(let encodingError):
print(encodingError)
}
}
如果还没有回答,最近我在使用 Alamofire 使用表单数据上传图像时遇到了同样的问题。
我能够使用 Postman 完全按照此 post 中显示的方式上传图像,但无法在我的应用程序中使用 Alamofire 进行上传。
您需要检查两件事,首先是服务器期望的文件名,其次是用于在 multipartFormData 闭包中附加正文部分的方法。
这两种方法在我的情况下不起作用 -
multipartFormData.appendBodyPart(data: imageData, name: "file")
这一个都不是
multipartFormData.appendBodyPart(data: imageData, name: "file", fileName: name)
但在这方面工作出色 -
multipartFormData.appendBodyPart(data: imageData, name: "file", fileName: "file.jpeg", mimeType: "image/jpeg")
问题基本上是服务器找不到具有预期名称的文件。
我希望这可以帮助人们节省时间来思考为什么它不起作用。
我认为这个问题已经过时了,但只要没有被接受的答案,请尝试以下操作:
multipartFormData.appendBodyPart(data: imageData, name: "name", fileName: "filename", mimeType: mimeType)
我最近在 body 中发布带有参数的多部分请求时从服务器收到了 404。我使用的是 UIImagePickerController(return 是一个 UIImage 的委托),然后我发送了它的 PNG 表示。
这只发生在磁盘上的 JPEG 文件中。奇怪的是,这个问题似乎只影响在 body 中也有参数的多部分请求。当 API 端点不需要任何其他东西时,它工作正常。
我的猜测是,在 JPEG -> UIImage -> PNG 表示形式中发生了一些奇怪的事情,导致了某种问题,奇怪的是,这些问题似乎只出现在多部分请求中,这些请求也有参数body。可能有一些特殊字符使服务器无法识别请求,只是 return 404.
我最终通过发送所选图像的 UIImageJPEGRepresentation 而不是 UIImagePNGRepresentation 来修复它,并且没有出现此类错误。