图片不会在我的Alamofire .post请求中发送到我的后端 - Swift 3

时间:2017-11-09 01:35:48

标签: ios json swift xcode alamofire

我正在创建一个登录过程,一切正常,但现在我正在尝试实现客户端配置文件照片功能并将照片发送到后端(我的后端开发人员有AWS来处理图像)。我一直收到错误,我会附上照片。

第一张照片: https://imgur.com/OKSWGmo

第二张照片: https://imgur.com/aZNOdmL

第一张照片是我的邮递员回复,请注意它是如何使用身体的表单数据。我认为这是我的错误所在,因为在我的代码中我只是创建一个简单字典的body属性,但我不确定Alamofire是否有表单数据的请求,如果是,那么如何在这里实现它们?在表单数据我提交"文件":我的图像," clientID":id,响应是一个对象。我试图从" profilePictures" 对象数组中获取" _id" 。我解析JSON的逻辑可能已关闭,其代码将在第二张照片中。

第二张照片中,我在屏幕上弹出了导致错误的功能,在Xcode调试器中,您会注意到错误' JSON写入中的无效类型(UIImage) )' 这进一步让我相信通过Alamofire帖子请求发送图像是一个坏主意。那么既然你已经看过我的代码和邮递员的回复,那么你们认为哪些是错的?表单数据正文是否重要,如果是,我该如何纠正?如果有任何关于我的情况的详细信息,请告诉我。

如果需要,这里有一些参考代码:

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
            }
    }
    )

1 个答案:

答案 0 :(得分:0)

1,上传文件你应该使用Alamofire.upload()方法。

2,multipartFormData.append(imageData!, withName: "file", fileName: "file.jpg", mimeType: "image/jpg")  你应该问你的后端是什么" name"他提供(你正在写一个"文件")。

3,你忘了通过" id"到你的后端?我无法在第二种方法中看到它。