ios - Swift 4 Alamofire 分段上传不起作用

标签 ios alamofire swift4 multipart xcode9.2

我正在使用 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)
        }
    }
}

有人帮忙吗?

最佳答案

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

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: "file"

也许对你有帮助。

谢谢

关于ios - Swift 4 Alamofire 分段上传不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50489453/

相关文章:

ios - 音频流 WiFi 到 WiFi - 广播

nsurlsession - 如何在状态栏中指示网络事件

ios - 从推送通知获取值 iOS Swift 4

ios - 当重复使用自定义 tableView 单元格时,相同的 subview 会重复显示(Swift 4.1)

ios - 无法使用 TabBar 委托(delegate)方法

swift - 如何将Alamofire生成的数据从tableview推送到webview

iphone - 使用 Alamofire 检索图像时遇到问题,有些图像加载,有些则不加载 (SWIFT)

ios - 为什么 Date 在 swift 4 中使用正确的格式时会返回 nil?

swift - 如何将一个标签(主 Storyboard)的数据传递到另一个标签(第二个 Storyboard)

ios - Swift - 无法使用存储的属性覆盖 'itemSize'