【问题标题】:Alamofire upload image corruptedAlamofire 上传图片损坏
【发布时间】:2019-05-18 22:33:07
【问题描述】:

我有使用 Alamofire 上传图片的功能。 当我上传它时,图像已损坏。但是当我将它保存到设备时,图像可以打开。

这是上传代码

Alamofire.upload(multipartFormData: { (_multipartFormData:MultipartFormData) in
        for (key, value) in parameters! {
            if key == "foto_id" {
                _multipartFormData.append(
                    "\(value)".data(using: String.Encoding.utf8)!,
                    withName: key,
                    fileName: "_foto_id.png",
                    mimeType: "image/png"
                )
            } else if key == "foto_selfie" {
                _multipartFormData.append(
                    "\(value)".data(using: String.Encoding.utf8)!,
                    withName: key,
                    fileName: "_foto_selfie.png",
                    mimeType: "image/png"
                )
            } else {
                //Data other than image
                _multipartFormData.append((value as! String).data(using: .utf8)!, withName: key)
            }
        }
    }, usingThreshold: 1, to: BASE_URL, method: .post) { (encodingResult:SessionManager.MultipartFormDataEncodingResult) in

        switch encodingResult {


        case .success(let upload, _, _):

            upload.responseObject{(response: DataResponse<clsResponsePostFotoID>) in

                let reqLoginResponse = response.result.value

                completionHandler(reqLoginResponse, nil)

            }
            break

        case .failure(let encodingError):
            print(encodingError)
            //                completionHandler(nil,encodingError as NSError?)
            break
        }
    }
}

如果我将"\(value)".data(using: String.Encoding.utf8)! 更改为value as! Data,它会显示错误

Cannot invoke 'append' with an argument list of type '(Data?, withName: String, fileName: String, mimeType: String)'

Overloads for 'append' exist with these partially matching parameter lists: (Data, withName: String, fileName: String, mimeType: String), (URL, withName: String, fileName: String, mimeType: String)

我该如何解决? 谢谢

【问题讨论】:

  • "\(value)".data(using: String.Encoding.utf8)!,,不。您正在使用description,显然不推荐。 value的类是什么?`Data? NSData? UIImage`?
  • @A.H.Nuri 无法使用类型为“(数据?,withName:String,fileName:String,mimeType:String)”的参数列表调用“append”

标签: ios swift xcode swift3 alamofire


【解决方案1】:

回答较晚,但可能对其他人有所帮助。

当以多部分的形式上传图像并且您有字符串字节时,使用 base64 而不是 utf8 对其进行编码。

extension String {
var base64Data: Data? {
    return Data.init(base64Encoded: self, options: .init(rawValue: 0))
   }
}

例如:

"\(bytes)".base64Data

【讨论】:

    【解决方案2】:

    你的代码有点乱,先把它弄清楚并格式化。顺便说一句,试试我的代码:

    var imageFrontData: Data?
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        picker.dismiss(animated: true, completion: nil)
        var uploadImage = WMCameraUtils.fixOrientation((info[UIImagePickerControllerEditedImage] as? UIImage)!)
        imageFrontData = UIImageJPEGRepresentation(uploadImage, 1.0)!
        self.uploadFile()
    }
    
    static func fixOrientation(_ img:UIImage) -> UIImage {
        if (img.imageOrientation == UIImageOrientation.up) {
            return img;
        }
    
        UIGraphicsBeginImageContextWithOptions(img.size, false, img.scale);
        let rect = CGRect(x: 0, y: 0, width: img.size.width, height: img.size.height)
        img.draw(in: rect)
    
        let normalizedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext();
        return normalizedImage;
    }
    
    func uploadFile() {
        Alamofire.upload(
            multipartFormData: { multipartFormData in
                /* self.imageFrontData is image data object */
                if let data = self.imageFrontData {
                    multipartFormData.append(data, withName: "front-photo", fileName: "front-photo.png", mimeType: "image/png")
                }
                for (key, value) in parameters {
                    multipartFormData.append((value?.data(using: String.Encoding.utf8)!)!, withName: key)
                }
        }, usingThreshold: UInt64.init(), to: uploadURL!, method: .post, headers: headers) { (result) in
            switch result {
            case .success(let upload, _, _):
                upload.responseJSON { response in
                    if let err = response.error {
    
                    }
                    /* do rest */
                }
            case .failure(let encodingError):
                /* error */
            }
        }
    }
    

    【讨论】:

    • ` multipartFormData.append((value?.data(using: String.Encoding.utf8)!)!, withName: key)` 改为((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!)
    • ((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!)崩溃
    • @Renzrz 你能像我一样做吗?我已经编辑了我的答案。它运行顺畅。
    • 不能在`multipartFormData.append(data, withName: "front-photo ", fileName: "front-photo.png", mimeType: "image/png")` 我不知道这个项目中的 alamofire 有什么问题。当我创建新项目时,multipartFormData.append 可以使用 datavalue as! Data 但是当我使用这个项目时,alamofire 总是显示错误无法使用类型为 '(Data, withName: String,文件名:字符串,mimeType:字符串)'
    【解决方案3】:

    试试这个代码:

    if let image = value as? UIImage, let imageData = UIImageJPEGRepresentation(image, 0.6) {
        multipartFormData.append(imageData, withName: key, fileName: key+".jpg", mimeType: "image/jpeg")
    }
    

    【讨论】:

    • 不能使用类型为 '(Any, withName: String, fileName: String, mimeType: String)'的参数列表调用'append'
    猜你喜欢
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多