图片不会在我的 Alamofire .post 请求中发送到我的后端 - Swift 3
Posted
技术标签:
【中文标题】图片不会在我的 Alamofire .post 请求中发送到我的后端 - Swift 3【英文标题】:Image won't send to my backend in my Alamofire .post request - Swift 3 【发布时间】:2017-11-09 01:35:48 【问题描述】:我正在创建一个登录过程,一切正常,但现在我正在尝试实现客户资料照片功能并将照片发送到后端(我的后端开发人员有 AWS 来处理图像)。一直报错,我会附上照片。
第一张照片: https://imgur.com/OKSWGmo
第二张照片: https://imgur.com/aZNOdmL
第一张照片是我的 Postman 回复,请注意它是如何将表单数据用于正文的。我认为这是我的错误所在,因为在我的代码中我只是创建了一个简单字典的 body 属性,但我不确定 Alamofire 是否有对表单数据的请求,如果有,如何在这里实现它们?在表单数据中我提交“文件”:我的图像和“clientID”:id,响应是一个对象。我正在尝试从 "profilePictures" 对象数组中获取 "_id"。我解析 JSON 的逻辑可能已关闭,其代码将在第二张照片中。
在第二张照片中,我截取了导致错误的函数,在 Xcode 调试器中,您会注意到错误 'Invalid type in JSON write (UIImage)' 这进一步让我相信通过 Alamofire 发布请求发送图像是一个坏主意。既然你已经看到了我的代码和 Postman 的回复,你们认为哪里出了问题?表单数据主体是否重要,如果是,我该如何纠正?感谢您提供任何帮助,如果您需要有关我的情况的更多详细信息,请告诉我。
这里有一些代码供必要时参考:
func sendClientProfileToAWS(profileImage: UIImage, id: String, completion: @escaping CompletionHandler)
// First grab the image and then the id of the client (NOTE: Client must already be created to use this)
let body: [String: Any] = [
"file": profileImage,
"clientID": id
]
Alamofire.request(CLIENT_UPLOAD_PROFILE_PHOTO, method: .post, parameters: body, encoding: JSONEncoding.default, headers: HEADER).responseJSON (response) in
print(response)
print("Uploading image file to db")
if response.result.error == nil
print(response.result)
if let jsonDict = response.result.value as? [String: Any]
let profile = jsonDict["profilePictures"] as? [[String: Any]]
for id in profile!
if let clientProfile = id["_id"] as? String
self.clientPhotoId = clientProfile
print("Photo ID - \(clientProfile)")
completion(true)
else
completion(false)
debugPrint(response.result.error as Any)
新更新的代码:
func sendClientProfileToAWS(profileImage: UIImage, id: String, completion: @escaping CompletionHandler)
let imageData = UIImageJPEGRepresentation(profileImage, 1.0)
let url = try! URLRequest(url: URL(string:CLIENT_UPLOAD_PROFILE_PHOTO)!, method: .post, headers: HEADER)
Alamofire.upload(
multipartFormData: multipartFormData in
multipartFormData.append(imageData!, withName: "file", fileName: "file.jpg", mimeType: "image/jpg")
,
with: url,
encodingCompletion: encodingResult in
switch encodingResult
case .success(let upload, _, _):
upload.uploadProgress(closure: (Progress) in
print("Upload Progress: \(Progress.fractionCompleted)")
)
**// Upload progress completes but the responses below never run?**
upload.responseJSON response in
if((response.result.value) != nil)
print(response.request!) // original URL request
print(response.response!) // URL response
print(response.data!) // server data
print(response.result)
if let jsonDict = response.result.value as? [String: Any]
print("In JSON")
let profile = jsonDict["profilePictures"] as? [[String: Any]]
for id in profile!
if let clientProfile = id["id"] as? String
self.clientPhotoId = clientProfile
self.setClientProfilePhoto(photoId: self.clientPhotoId!) // Taks photo id
self.getClientProfilePhoto(id: id) // Takes clientID
completion(true)
else
completion(false)
print("There is an error")
case .failure( _):
break
)
【问题讨论】:
尝试使用多部分表单数据上传? 好的,所以我实现了多部分表单数据,但我似乎仍然无法让它工作。如果你想看一下,我已经编辑了我的帖子。上传进度后,据我所知,其他代码没有运行,但也没有抛出错误。 试试@Meonardo 的答案。 【参考方案1】:1、上传文件你应该使用Alamofire.upload()
方法。
2, multipartFormData.append(imageData!, withName: "file", fileName: "file.jpg", mimeType: "image/jpg")
您应该询问您的后端他提供的“名称”(您正在编写一个“文件”)。
3,您是否忘记将“id”传递给您的后端?第二种方法看不到。
【讨论】:
以上是关于图片不会在我的 Alamofire .post 请求中发送到我的后端 - Swift 3的主要内容,如果未能解决你的问题,请参考以下文章
Alamofire publishDecodable 不会向服务器发送请求,但 responseDecodable 会