【问题标题】:Alamofire multipart upload giving errorAlamofire 分段上传给出错误
【发布时间】:2019-01-26 05:22:13
【问题描述】:

我正在尝试使用 Alamofire Multipart Form 数据将图像上传到服务器,但是在执行时出现错误

异常'NSInvalidArgumentException',原因:'-[__NSCFNumber dataUsingEncoding:]: 无法识别的选择器发送到实例 0x1669e250'

排队

MultipartFormData.append(((value as AnyObject).data(using: String.Encoding.utf8.rawValue))!, withName: key)

下面是我的完整代码

guard let image = selectedImage else {
        return
    }

    let heightInPixels = Int(image.size.height * image.scale)
    let widthInPixels = Int(image.size.width * image.scale)



     let parameters: Parameters = ["user_id":  Utility().getBearerToken(),"description": descriptionTextView.text ?? "",
     "lat": self.lat ?? "" , "long":self.long ?? "" ,
     "location_name": locationTextView.text ?? "" ,
     "height": heightInPixels, "width": widthInPixels];


//    let parameters: Parameters = ["user_id":  Utility().getBearerToken()];
    print(parameters)
    Alamofire.upload(multipartFormData: { MultipartFormData in
        for (key, value) in parameters {
            MultipartFormData.append(((value as AnyObject).data(using: String.Encoding.utf8.rawValue))!, withName: key)

        }

        let imgData = UIImageJPEGRepresentation(image,1)
        MultipartFormData.append(imgData!, withName: "file", fileName: "upload.jpg", mimeType: "image/jpeg")

    }, to: "http://server.com/upload.php") { (result) in
        switch result {
        case .success(let upload, _, _):
            upload.uploadProgress(closure: { (Progress) in
                print("Upload Progress: \(Progress.fractionCompleted)")
            })

            upload.responseString { response in
                print(response.result.value!)
            }       
        case .failure(let encodingError):
            print(encodingError.localizedDescription)
            break
        }
  }

我尝试使用 MultipartFormData.append(value.data(using: .utf8)!, withName: name!),但它说 value 没有成员数据

【问题讨论】:

  • @AliMoazenzadeh 你能解释一下这是怎么回事

标签: ios swift alamofire


【解决方案1】:

这是使用您的其他 API 参数上传视频和图像的功能。

func uploadWithAlamofire(Parameters params : [String: Any]?,ImageParameters imgparams :  [NSObject : AnyObject]?,VideoParameters vidoparam :  [NSObject : AnyObject]?,Action action : NSString, success: @escaping (AnyObject) -> Void, failure: @escaping (AnyObject) -> Void)
    {
        var base_url = BASEURL
        base_url.append(action as String)
        print(base_url)
        var headers : HTTPHeaders = [:]
        if let token = UserDefaults.standard.value(forKey: "webToken"){
            headers = ["JWT-Authorization": "Bearer \(token)"]
        }

        Alamofire.upload(multipartFormData: { multipartFormData in
            if imgparams != nil{
                for (key, value) in imgparams! {
                    if let imageData = UIImageJPEGRepresentation(value as! UIImage, 1) {
                        multipartFormData.append(imageData, withName: key as! String, fileName: "\(NSDate().timeIntervalSince1970 * 1000)).jpg", mimeType: "image/jpg")
                    }
                }
            }
            if vidoparam != nil{
                for (key, value) in vidoparam! {
                    multipartFormData.append(value as! URL , withName: key as! String, fileName: "\(NSDate().timeIntervalSince1970 * 1000).mp4", mimeType: "application/octet-stream")
                }
            }
            if params != nil
            {
                for (key, value) in params! {
                    multipartFormData.append((value as! String).data(using: .utf8)!, withName: key as! String)
                }
            } }, to: base_url, method: .post, headers: headers,
                 encodingCompletion: { encodingResult in
                    switch encodingResult {
                    case .success(let upload, _, _):
                        upload.uploadProgress { progress in
                            print(progress.fractionCompleted)
                        }
                        upload.response { [weak self] response in
                            guard self != nil else {
                                return
                            }
                            let responseString = String(data: response.data!, encoding: String.Encoding.utf8)
                            var dictonary:NSDictionary?
                            if let data = responseString?.data(using: String.Encoding.utf8) {
                                do {
                                    dictonary = try JSONSerialization.jsonObject(with: data, options: []) as? [String:AnyObject] as NSDictionary?

                                    if dictonary != nil{
                                        if dictonary?.value(forKey: "status_code") as! String == "200"{
                                            return success(dictonary!)
                                        }else{
                                            print(dictonary?.value(forKey: "status_code")! as Any)
                                            let errorMsg : Any = Int(dictonary?.value(forKey: "status_code") as Any)
                                            utility.showAlertWithStatusCode(code: errorMsg)
                                        }
                                    }
                                } catch let error as NSError {
                                    print(error)
                                }
                            }

                        }
                    case .failure(let encodingError):
                        print("error:\(encodingError)")
                        return failure(encodingError as AnyObject)
                    }
        })
    }

【讨论】:

    【解决方案2】:

    在下面试试这个函数,它正在工作。

    func uploadImage(urlString : String , image : UIImage, param : [String : Any], completionHandler : @escaping ( _ result : Any?) -> ())  {
    
        guard let imageData = UIImageJPEGRepresentation(image, 0.5) else {
            print("Could not get JPEG representation of UIImage")
            return
        }
    
        Alamofire.upload(multipartFormData: { multipartFormData in
            for (key, value) in param {
                multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key as String)
            }
    
            multipartFormData.append(imageData,
                                     withName: "image",
                                     fileName: "image.jpg",
                                     mimeType: "image/jpeg")
        },
                         to: urlString,
                         headers: ["Authorization": "Basic xxx"],
                         encodingCompletion: { encodingResult in
    
                            switch encodingResult {
                            case .success(let upload, _, _):
                                upload.uploadProgress { progress in
                                }
                                upload.validate()
                                upload.responseJSON { response in
                                    completionHandler(response.result.value)
                                }
                            case .failure(let encodingError):
                                print(encodingError)
                                completionHandler(nil)
                            }
        })
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多