图片不会在我的 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 (post) 上传图片?

Alamofire publishDecodable 不会向服务器发送请求,但 responseDecodable 会

使用 Alamofire 的多部分 POST

使用 Alamofire 发送包含图像和 json 的发布请求

Alamofire POST 路由返回数据

快速的 Alamofire POST 请求