无法在 Alamofire 4.0 中使用类型为“(String,withName:String)”的参数列表调用“附加”

Posted

技术标签:

【中文标题】无法在 Alamofire 4.0 中使用类型为“(String,withName:String)”的参数列表调用“附加”【英文标题】:Cannot invoke 'append' with an argument list of type '(String, withName: String)' in Alamofire 4.0 【发布时间】:2016-12-30 19:47:51 【问题描述】:

我正在使用 Alamofire 4.0 在选择或通过设备/相机录制视频后将视频上传到服务器,但是当我尝试使用 append 调用上传函数时,我在所有 append 语句中都出现了这个错误,出了什么问题在我的代码中。

我的第二个问题是,如果我想在上传过程中显示进度百分比,我如何通过 Alamofire 实现这一点。

谢谢:)

阅读所选/录制视频的网址后我的代码

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) 


    let mediaType:AnyObject? = info[UIImagePickerControllerMediaType] as AnyObject?

    if let type:AnyObject = mediaType 
        if type is String 
            let stringType = type as! String
            if stringType == kUTTypeMovie as String 
                let urlOfVideo = info[UIImagePickerControllerMediaURL] as? NSURL
                if let url = urlOfVideo 
                    // 2

                    print(url)

                    let URL = try! URLRequest(url: "myurl", method: .post, headers: ["Authorization": "auth_token"])


                    Alamofire.upload(multipartFormData:  multipartFormData in

                        multipartFormData.append(url, withName: "videoFile", fileName: "filename", mimeType: "mov")
                        multipartFormData.append("video", withName: "load")
                        multipartFormData.append("record", withName: "type")

                    , with: URL, encodingCompletion:  (result) in
                        // code
                    )


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


【问题讨论】:

【参考方案1】:

关于错误信息:

无法使用“(String, withName: String)”类型的参数列表调用“append

如果我们看一下 Alamofire 的 MultipartFormDataappend 方法:

Alamofire/Source/MultipartFormData.swift

我们注意到,没有append(...) 方法允许String 类型的第一个参数,但是,当您将multipartFormData 附加到Alamofire.upload 的闭包中时,您会尝试使用该参数。

multipartFormData.append("video", withName: "load")
multipartFormData.append("record", withName: "type")

我相信您正在尝试使用以下方法:

public func append(_ data: Data, withName name: String)  ... 

在这种情况下,您需要将字符串编码为 Swift 类型 Data,例如如下:

multipartFormData.append("video".data(using: .utf8)!, withName: "load")
multipartFormData.append("record".data(using: .utf8)!, withName: "type") 

至于你的电话:

multipartFormData.append(url, withName: "videoFile", fileName: "filename", mimeType: "mov")

上面的不可变 url 属于 NSURL 类型。在 Swift 3 中,您应该更喜欢使用 Foundation 类型 URL,它桥接到 NSURL,但不是同一类型。我们在 Alamofire 4 中看到,它特别希望您尝试在上面调用的 append 函数使用 URL 类型:

public func append(_ fileURL: URL, withName name: String, fileName: String, mimeType: String)

您自己已经注意到,您可以使用一种变通方法来调用此方法,即在您的实例url 上使用NSURLabsoluteURL 属性;但这只会产生URL 类型的可选项。更好的方法是从一开始就使用URL 类型而不是NSURL

【讨论】:

它解决了我的问题,但第一行是视频的 URL 给出了这个错误“不能调用 'append' 类型的参数列表 '(NSURL, withName: String, fileName: String, mimeType: String)' " 我通过在 URL multipartFormData.append(url.absoluteURL!, withName: "videoFile", fileName: "filename", mimeType: "mov") 中输入 .absoluteURL 解决了这个问题。在这种情况下如何在上传视频时制作进度条? @SamahAhmed url 的类型为 NSURL。在 Swift 3 中,我们可以使用 Foundation 类型 URL 而不是 NSURL(前者是后者的桥梁,但不是同一类型),我们在 Alamofire 4 中看到它特别期望前者类型,例如为func append(_ fileURL: URL, withName name: String, fileName: String, mimeType: String)NSURLabsoluteURL 属性实际上是 URL 类型的可选属性。更好的方法是从一开始就使用URL 而不是NSURL @SamahAhmed 至于进度条:我认为这超出了问题的范围,最好尝试将问题限制在一个特定的主题上(这会增加有人回答它们的机会,因为并允许为未来的读者找到问答)。现在您已经解决了multipartFormData 的语法错误,我相信您应该创建一个新问题,专门涵盖如何跟踪进度,但是从跟踪进度到实际实现进度条的步骤也相当大,我怀疑回答者希望看到你自己的尝试。 是的,我现在就这样做:)【参考方案2】:

我们可以做到。

    static func requestMultiPartFromData(image: UIImage, fileName: String)
        let url = "Your URL HERE"
        Alamofire.upload(
            multipartFormData:  multipartFormData in
                guard let image = image.toString() else  return 
                multipartFormData.append(image.data(using: .utf8)!, withName: fileName)
        ,
            to: url,
            encodingCompletion:  encodingResult in
                switch encodingResult 
                case .success(let upload, _, _):
                    upload.responseJSON  response in
                        debugPrint(response)
                    
                case .failure(let encodingError):
                    print(encodingError)
                
        
        )
    

带扩展名

extension UIImage 
    func toString() -> String? 
        let data: Data? = UIImage.pngData(self)()
        return data?.base64EncodedString(options: .endLineWithLineFeed)
    

【讨论】:

以上是关于无法在 Alamofire 4.0 中使用类型为“(String,withName:String)”的参数列表调用“附加”的主要内容,如果未能解决你的问题,请参考以下文章

在 swift 4.0 中使用 Alamofire/SwiftyJSON 时出错

Alamofire 4.0 上的“类型‘任何’没有下标成员”错误

使用 Swift 3 的 Alamofire 4.0 出现“没有成员”错误

Alamofire 4.0 路由器表达式类型不明确,没有更多上下文

尝试通过 Alamofire 4.0 上传图像时,类型“ParameterEncoding”没有成员“URL”

如何在 Xcode 8.0 中安装 Alamofire 4.0