【问题标题】:Cannot invoke 'append' with an argument list of type '(String, withName: String)' in Alamofire 4.0无法在 Alamofire 4.0 中使用类型为“(String,withName:String)”的参数列表调用“附加”
【发布时间】: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)

}

【问题讨论】:

    标签: ios swift swift3 alamofire


    【解决方案1】:

    关于错误信息:

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

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

    我们注意到,没有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)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-18
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多