【问题标题】:Swift 4 Alamofire multipart upload not workingSwift 4 Alamofire 分段上传不起作用
【发布时间】:2018-11-02 12:10:18
【问题描述】:

我正在使用 alamofire 4.7 和 swift 4

我需要上传图片和json到服务器。

我正在使用下面的代码上传结果失败,但数据正在插入服务器但没有得到响应,显示一些类似这样的序列化错误

▿ result : FAILURE: responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}))
    ▿ failure : AFError
      ▿ responseSerializationFailed : ResponseSerializationFailureReason
  ▿ timeline : Timeline: { "Request Start Time": 548835779.066, "Initial Response Time": 548835779.074, "Request Completed Time": 548835779.127, "Serialization Completed Time": 548835779.127, "Latency": 0.008 secs, "Request Duration": 0.061 secs, "Serialization Duration": 0.000 secs, "Total Duration": 0.061 secs }
    - requestStartTime : 548835779.06617701
    - initialResponseTime : 548835779.07390201
    - requestCompletedTime : 548835779.12704694
    - serializationCompletedTime : 548835779.12748504
    - latency : 0.0077250003814697266
    - requestDuration : 0.060869932174682617
    - serializationDuration : 0.00043809413909912109
    - totalDuration : 0.061308026313781738
  ▿ _metrics : Optional<AnyObject>

================================================ ===================

        let auth : String = MitraModal.sharedInstance().getBasicAuthenticationString()
    let headers = ["Authorization": auth, "Content-type": "multipart/form-data"]

    Alamofire.upload(multipartFormData: { (multipartFormData) in

        multipartFormData.append("\(parameters)".data(using: String.Encoding.utf8)!, withName: "data" as String)

        if (!imageArray.isEmpty) {

            for item in imageArray {
                multipartFormData.append(item!, withName: "file", fileName: "image.png", mimeType: "image/png")
            }
        }

    }, usingThreshold: UInt64.init(), to: url, method: .post, headers: headers) { (result) in
        switch result{
        case .success(let upload, _, _):
            upload.responseJSON { response in

                if let JSON = response.result.value
                {
                    print("JSON: \(JSON)")
                    onCompletion?(JSON as? JSON)

                    print("Successfully uploaded")
                }

                if let err = response.error {
                    onError?(err)
                    return
                }
                onCompletion?(nil)
            }
        case .failure(let error):
            print("Error in upload: \(error.localizedDescription)")
            onError?(error)
        }
    }
}

有人帮忙吗?

【问题讨论】:

  • 请检查您得到的实际响应。我认为这将帮助您找到错误。
  • 也分享你的错误。
  • 错误我更新了,请检查

标签: ios alamofire swift4 multipart xcode9.2


【解决方案1】:

由于我是新手,但前几天上传图片时遇到同样的问题,您必须在服务器端使用 file 接受图片,因为您的图片标签包含 withName: "文件" .

func AlamofireUploadImages(){

    let url : String = URL_IP+"/ZameenServer/api/addNewProperty.php"
    for img in HOUSEImages{
        let data  = UIImageJPEGRepresentation(img, 0.2)!
        ImagesData.append(data)
    }

    let parameters = [
        "userId"                : "5",
        "unit"                  : "6789"
    ] //Optional for extra parameter

    Alamofire.upload(multipartFormData: { multipartFormData in
        for imageData in self.ImagesData {
            multipartFormData.append(imageData, withName: "file[]", fileName: self.randomString(length: 5)+".jpeg", mimeType: "image/jpeg")
        }
        for (key, value) in parameters {
            multipartFormData.append((value?.data(using: String.Encoding.utf8)!)!, withName: key)
        } //Optional for extra parameters
    },
                     to:url)
    { (result) in

        switch result {
        case .success(let upload, _, _):

            upload.uploadProgress(closure: { (progress) in
                print("Upload Progress: \(progress.fractionCompleted)")
            })

            upload.responseJSON
                {
                    response in
                    print("Response :\(response.result.value)")
            }

        case .failure(let encodingError):
            print("no Error :\(encodingError)")
        }
    }

}

注意:由于我正在上传图片数组,因此上传多张图片使用 withName: "file[]" 或单张图片使用 withName: “文件”

也许对你有帮助。

谢谢

【讨论】:

  • 我需要发送文本文件和图像文件,正在休息客户端工作
  • 您需要将文档下载到本地文件系统中,然后使用另一个调用从中读取数据并将其转换为您当前视图可以显示的对象类型。 quora.com/…
  • 文本表示json数据参数有点大数据[String : Any],它在rest客户端工作,而不是alamofire,好吧我会尝试一次
  • 试试再试试 :)
  • 我也需要你的帮助,你可以看看我的问题 [stackoverflow.com/questions/50492284/…
【解决方案2】:
   let url = BaseViewController.API_URL + "uploads"
    let image = info[UIImagePickerControllerEditedImage] as? UIImage
    let imgData = UIImageJPEGRepresentation(image!, 0.2)!

    let parameters = [
                            "user_id" : UserDefaults.standard.value(forKey: "userId")!
    ]

    Alamofire.upload(multipartFormData: { multipartFormData in
        multipartFormData.append(imgData, withName: "uload_data",fileName: "file.jpg", mimeType: "image/jpg")
        for (key, value) in parameters {
            multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
        } //Optional for extra parameters
    },
                     to:url)
    { (result) in
        switch result {
        case .success(let upload, _, _):

            upload.uploadProgress(closure: { (progress) in
                print("Upload Progress: \(progress.fractionCompleted)")
            })

            upload.responseJSON { response in

                self.objHudHide()
                print(response.result.value)

                let jsonDict : NSDictionary = response.result.value as! NSDictionary

                print(jsonDict)
                if  jsonDict["status"] as! String == "Success"
                {


                    let detailDict : Dictionary = jsonDict["detail"] as! Dictionary<String,Any>

                    if let getTotalPrice = detailDict["total_price"]
                    {
                        self.lblTotalPrice.text = "$ \(getTotalPrice) + Free Shipping"
                    }

                    if  let getTotalSize = detailDict["total_upload_size"]
                    {
                        self.lblTotalSize.text = "Total Size : \(getTotalSize)"

                    }
                }
               else
                {

                let alertViewController = UIAlertController(title: NSLocalizedString("Alert!", comment: ""), message:"Something Went wrong please try again." , preferredStyle: .alert)
                let okAction = UIAlertAction(title: NSLocalizedString("Ok", comment: ""), style: .default) { (action) -> Void in

                }
                alertViewController.addAction(okAction)
                self.present(alertViewController, animated: true, completion: nil)


        }
            }

        case .failure(let encodingError):
            print(encodingError)
        }
    }

【讨论】:

    【解决方案3】:

    我也遇到了类似的问题。这可能会导致几个原因。在我的情况下,这是 POST 请求的参数键错误。当您执行以下行时

    multipartFormData.append(item!, withName: "file", fileName: "image.png", mimeType: "image/png")
    

    withName:"file"属性指的是POST请求图片的参数key(Json请求的key)。所以你不能在这里使用你想要的任何文本。请添加您的 API 引用的图像的正确参数键,而不是 "file"。假设 API 使用“fileImage”作为参数键访问图像。所以上面一行应该是这样的。

    multipartFormData.append(item!, withName: "fileImage", fileName: "image.png", mimeType: "image/png")
    

    【讨论】:

      猜你喜欢
      • 2017-01-28
      • 2017-06-10
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      • 2018-07-21
      • 1970-01-01
      相关资源
      最近更新 更多