无法在 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 的 MultipartFormData
的 append
方法:
我们注意到,没有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
上使用NSURL
的absoluteURL
属性;但这只会产生URL
类型的可选项。更好的方法是从一开始就使用URL
类型而不是NSURL
。
【讨论】:
它解决了我的问题,但第一行是视频的 URL 给出了这个错误“不能调用 'append' 类型的参数列表 '(NSURL, withName: String, fileName: String, mimeType: String)' " 我通过在 URL multipartFormData.append(url.absoluteURL!, withName: "videoFile", fileName: "filename", mimeType: "mov") 中输入 .absoluteURL 解决了这个问题。在这种情况下如何在上传视频时制作进度条? @SamahAhmedurl
的类型为 NSURL
。在 Swift 3 中,我们可以使用 Foundation 类型 URL
而不是 NSURL
(前者是后者的桥梁,但不是同一类型),我们在 Alamofire 4 中看到它特别期望前者类型,例如为func append(_ fileURL: URL, withName name: String, fileName: String, mimeType: String)
。 NSURL
的 absoluteURL
属性实际上是 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 路由器表达式类型不明确,没有更多上下文