使用 alamofire 上传图像显示此问题(原因:Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLen

Posted

技术标签:

【中文标题】使用 alamofire 上传图像显示此问题(原因:Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)【英文标题】:upload image using alamofire shows this issue (reason: Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength) 【发布时间】:2018-10-22 21:09:08 【问题描述】:

我正在尝试将图像上传到服务器我的代码

@IBAction func startUploadClicked(_ sender: UIButton) 

    // get image form uiimageview 
    let image = theImage.image

    // and here is the api example provided by my backend developer 

   //
   //"Id":11,
   //"FileName":"Hydrangeas.jpg",
   //"ImageData":"base64string"
   //

    let imageData = convertImageToBase64(image: image!)
    let imageNewData = UIImageJPEGRepresentation(image!, 0.7)
    let Id = "\(12)"
    let FileName = "image.jpg"




    let headers = [
        "SecurityToken": UserDefaults.standard.string(forKey: "SecurityToken")!,
        "api_key": "Ml3BHS17tJ89Y3Tf4QC3",
        "Content-Type":"application/json"
    ]


    let parameters = [
        "Id":"\(12)",
        "FileName":"image.jpg",
        "ImageData":"\(imageData)"
        ]


    Alamofire.upload(
        multipartFormData:  multipartFormData in

            for (key, value) in parameters 
                multipartFormData.append((value.data(using: String.Encoding.utf8)!), withName: key)
            

    ,
        to: "https://serverName/AddPhoto", headers: headers,
        encodingCompletion:  encodingResult in
            switch encodingResult 
            case .success(let upload, _, _):
                upload.responseJSON  response in

                    debugPrint(response)
                
            case .failure(let encodingError):

                print(encodingError)
            
    
    )

这是运行代码后在命令中显示的内容

[请求]: POST https://serverName/AddPhoto [响应]: URL:https://serverName/AddPhoto 状态码:413,标头 “内容长度” = ( 0 ); 日期 = ( “格林威治标准时间 2018 年 10 月 22 日星期一 20:52:43” ); 服务器 = ( “微软-IIS/8.5” ); “X-Powered-By”=( “ASP.NET” ); [数据]:0字节 [结果]:失败:responseSerializationFailed(原因:Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength) [时间线]:时间线:“请求开始时间”:561934363.529,“初始响应时间”:561934363.836,“请求完成时间”:561934364.234,“序列化完成时间”:561934364.241,“延迟”:0.307秒,“请求持续时间” :0.705 秒,“序列化持续时间”:0.006 秒,“总持续时间”:0.711 秒

【问题讨论】:

HTTP 状态码 413 表示文件太大。检查服务器设置。 好的,但是序列化兄弟呢?如果我尝试上传较小的图像,它会消失吗? 同时我正在使用 UIImageJPEGRepresentation(image!, 0.7) 正如你看到的那样减小尺寸是不正确的吗? 您使用的是 imageData 而不是 imageNewData。 是的,我是因为后端开发人员要求我使用 base64 【参考方案1】:

将来要为谁搜索 我通过发出正常的 Alamofire 请求而不是使用 Alamofire.upload 来解决它 因为我已经在这里将图像转换为字符串我的新代码

@IBAction func startUploadClicked(_ sender: UIButton) 


    let image = theImage.image
    let imageData = convertImageToBase64(image: image!)


    let headers = [
        "SecurityToken": UserDefaults.standard.string(forKey: "SecurityToken")!,
        "api_key": "Ml3BHS17tJ89Y3Tf4QC",
        "Content-Type":"application/json"
    ]


    let parameters = [
        "Id":"\(balaghID)",
        "FileName":"image.jpg",
        "ImageData":"\(imageData)"
        ]

    Alamofire.request("https://serverName/addPhoto", method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: Constant.Header).responseJSON  response in



        if let JSON = response.result.value as? [String:Any] 

            if let ActionResult = JSON["ActionResult"] as? [String:Any]

                if let Errcode = ActionResult["Errcode"] as? NSNumber 

                    if Errcode != NSNumber(value: 0) 

                        Helper.showAlert("bad operation", message: "error \(ActionResult["ErrDescription"]!)", VC: self)

                     else 

                        Helper.showAlert("Great you make it", message: "

(ActionResult["ErrDescription"]!)", VC: self)

                    

                

            

        

    


【讨论】:

以上是关于使用 alamofire 上传图像显示此问题(原因:Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLen的主要内容,如果未能解决你的问题,请参考以下文章

使用 Alamofire 将图像数组上传到服务器

如何使用 alamofire 和数组形式的参数上传图像

如何使用 alamofire 上传多个文件并显示进度?

带有 MultiPart 表单数据中的参数的图像上传在 Alamofire 4.0 中不起作用

使用 Alamofire 上传图像的问题(将图像作为参数)

Alamofire - 使用照片时图像上传失败