【问题标题】:Ambiguous reference to member 'upload(_:to:method:headers:interceptor:)'对成员'upload(_:to:method:headers:interceptor:)'的模糊引用
【发布时间】:2019-09-05 06:17:48
【问题描述】:

我正在使用 Alamofire 上传按钮按下时的图像,但它在

处显示错误

AF.upload(multipartFormData: {MultipartFormData 行方法

(注意:Alamofire 5.0 更新后 Alamofire.upload 改为 AF.upload)

@IBAction func btnUploadImage(_ sender: UIButton) {

    let uploadDict = ["user_id":getUserId] as [String:String]

    AF.upload(multipartFormData: { MultipartFormData in

                let image :Data = UIImageJPEGRepresentation(self.uploadImg.image!, 1.0)!

                MultipartFormData.append(image, withName: "image" , fileName: "image.jpeg" , mimeType: "image/jpeg")
                for(key,value) in uploadDict{

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

            }, to: "http://XXXXXXXXXXXXXXXX/uploadImage", encodingCompletion: {
                EncodingResult in
                switch EncodingResult{
                case .success(let upload, _, _):
                    upload.responseJSON { response in
                        debugPrint("SUCCESS RESPONSE: \(response)")
                    }
                case .failure(let encodingError):

                    print("ERROR RESPONSE: \(encodingError)")

                }        })

//查看此代码的控制器

import UIKit
import Alamofire
class updateVC: UIViewController, UIImagePickerControllerDelegate,UINavigationControllerDelegate {

//MARK:- OUTLETS
@IBOutlet weak var tFeditName: UITextField!
@IBOutlet weak var tFusername: UITextField!
@IBOutlet weak var tFemail: UITextField!
@IBOutlet weak var uploadImg: UIImageView!
@IBOutlet weak var tVeditAddress: UITextView!


//MARK:- DECLARATIONS

var imagePicker = UIImagePickerController()

var editName = String()
var editUserName = String()
var editEmail = String()
var editImage = UIImage()
var editAddress = String()
var getUserId = String()

//MARK:- LIFE CYCLE
override func viewDidLoad() {
    super.viewDidLoad()

    imagePicker.delegate = self

    tFeditName.text = editName
    tFusername.text = editUserName
    tFemail.text = editEmail
    uploadImg.image = editImage
    tVeditAddress.text = editAddress

}
//MARK:- CUSTOM FUNCTIONS

func postJSON() {

    let param = ["fullname":tFeditName.text!,"username":tFusername.text!,"email":tFemail.text!,"address":tVeditAddress.text!,"user_id":getUserId] as NSDictionary


    AF.request("http://XXXXXXXXXXXXXXXXXXXX/updatedetails", method: .post, parameters: param as? Parameters, encoding: URLEncoding.default).responseJSON { response in

        switch response.result{

        case .success(let json):
            print(json)

            DispatchQueue.main.async {
                print(param)
            }
        case.failure(let Error):

            print(Error)
        }
    }

}

//ImageViewPicker

func openCamera()
{
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera) {
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = UIImagePickerController.SourceType.camera
        imagePicker.allowsEditing = false
        self.present(imagePicker, animated: true, completion: nil)
    }
    else
    {
        let alert  = UIAlertController(title: "Warning", message: "You don't have camera", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
        self.present(alert, animated: true, completion: nil)
    }
}

func openGallery()
{
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary){
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.allowsEditing = true
        imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
        self.present(imagePicker, animated: true, completion: nil)
    }
    else
    {
        let alert  = UIAlertController(title: "Warning", message: "You don't have permission to access gallery.", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
        self.present(alert, animated: true, completion: nil)
    }
}

internal func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    if let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {

        uploadImg.image = pickedImage

    }
    picker.dismiss(animated: true, completion: nil)
}



//MARK:- ACTIONS

@IBAction func btnSelectImage(_ sender: UIButton) {

    let alert = UIAlertController(title: "Choose Image", message: nil, preferredStyle: .actionSheet)
    alert.addAction(UIAlertAction(title: "Camera", style: .default, handler: { _ in
        self.openCamera()
    }))

    alert.addAction(UIAlertAction(title: "Gallery", style: .default, handler: { _ in
        self.openGallery()
    }))

    alert.addAction(UIAlertAction.init(title: "Cancel", style: .cancel, handler: nil))

    self.present(alert, animated: true, completion: nil)


}

@IBAction func btnUploadImage(_ sender: UIButton) {

    let image: UIImage? = self.uploadImg.image

    let uploadDict = ["user_id":getUserId] as [String:String]

    AF.upload(multipartFormData: { MultipartFormData in

        let image :Data = (image?.jpegData(compressionQuality: 1))!

        MultipartFormData.append(image, withName: "image" , fileName: "image.jpeg" , mimeType: "image/jpeg")
        for(key,value) in uploadDict{

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

    }, to: "http://XXXXXXXXXXXXXXXX/uploadImage", encodingCompletion: {
        EncodingResult in
        switch EncodingResult{
        case .success(let upload, _, _):
            upload.responseJSON { response in
                debugPrint("SUCCESS RESPONSE: \(response)")
            }
        case .failure(let encodingError):

            print("ERROR RESPONSE: \(encodingError)")

        }        })

}
@IBAction func btnUpdateDetails(_ sender: UIButton) {

    postJSON()
    self.navigationController?.popViewController(animated: true)
}

}

【问题讨论】:

  • 我假设您已在某处将 Alamofire 定义为 AF。如果您看到错误“UIImageJPEGRepresentation”已替换为 self.uploadImg.image.jpegData(compressionQuality: 1)。让我知道这是否有效。
  • @Pavan 你对这一行的更改 let image :Data = UIImageJPEGRepresentation(self.uploadImg.image!, 1.0)!是有效的,但我的错误仍然存​​在,我在同一个 VC 中使用 AF 用于 AF.request 函数用于 updateDetrails,第二个是用于图像上传 AF.upload 按钮按下
  • 可以分享VC代码吗?也让我知道你的代码中 Alamofire 的确切版本。
  • 我为此代码提供了 viewController,Alamofire 版本是 pod 'Alamofire', '~> 5.0.0-beta.3' @Pavan
  • 我将 Alamofire 版本从 beta 3 更新到 beta 5,但仍然出现同样的错误,请查看我的 VC

标签: ios swift iphone alamofire


【解决方案1】:

来自 Alamofire 5.0 迁移指南:

  • MulitpartFormData 的 API 已更改,用于创建和上传 MultipartFormData 的顶级上传方法已更新以匹配其他请求 API,因此不再需要处理多部分编码的 Result。

所以你的代码应该是这样的:

@IBAction func btnUploadImage(_ sender: UIButton) {
  let uploadDict = ["user_id": "getUserId"] as [String:String]

  AF.upload(multipartFormData: { MultipartFormData in

    let image: Data = self.uploadImg.image!.jpegData(compressionQuality: 1.0)!

     MultipartFormData.append(image, withName: "image" , fileName: "image.jpeg" , mimeType: "image/jpeg")
            for(key,value) in uploadDict {
                MultipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
            }
        }, to: "http://XXXXXXXXXXXXXXXX/uploadImage", method: .post, headers: ["Content-Type": "application/json", 
         "authorization": "bearer \(token)"])
   .responseJSON { (response) in
            debugPrint("SUCCESS RESPONSE: \(response)")
   }
}

所以你不需要encodingCompletion 关闭并立即使用responseJSON。

【讨论】:

  • 如何在这种方法中添加标题?因为它给了我这个错误:对成员'upload(_:to:method:headers:interceptor:fileManager :)'的模糊引用
  • @ShardaPrasad 在 url 添加方法和标题后,我更新了答案,请检查 - Hosny 22 小时前
【解决方案2】:

检查这个: https://github.com/Alamofire/Alamofire/issues/2942
搜索“创建参数字典 [String: Data] 然后将条目附加到实际文件之前”

【讨论】:

  • 这最好作为评论,而不是答案
【解决方案3】:

我刚刚用

安装了 pod
pod 'Alamofire', '~> 5.0.0-beta.5'

//示例代码

let image: UIImage? = self.uploadImg.image;

    let uploadDict = ["user_id":getUserId] as [String:String]

    Alamofire.upload(multipartFormData: { MultipartFormData in

        let image :Data = (image?.jpegData(compressionQuality: 1))!

        MultipartFormData.append(image, withName: "image" , fileName: "image.jpeg" , mimeType: "image/jpeg")
        for(key,value) in uploadDict{

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

    }, to: "http://XXXXXXXXXXXXXXXX/uploadImage", encodingCompletion: {
        EncodingResult in
        switch EncodingResult{
        case .success(let upload, _, _):
            upload.responseJSON { response in
                debugPrint("SUCCESS RESPONSE: \(response)")
            }
        case .failure(let encodingError):

            print("ERROR RESPONSE: \(encodingError)")

        }        })

【讨论】:

  • 将 AF.request 更改为 Alamofire.request + i 将 Alamofire 版本 5.0 降级为 4.8.2 后解决了错误,该版本成功运行感谢 @Pavan 兄弟
  • 通常它应该显示正确的错误,但不确定为什么它会给出不同的错误。对你有任何好处。
  • 是的,代码是正确的,但错误来自 alamofire 版本,它给出了不同的错误,再次感谢您的帮助:) @Pavan
猜你喜欢
  • 1970-01-01
  • 2017-04-17
  • 2016-11-21
  • 1970-01-01
  • 2019-11-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多