如何使用 Alamofire 上传具有身份验证的 MultipartFormData
Posted
技术标签:
【中文标题】如何使用 Alamofire 上传具有身份验证的 MultipartFormData【英文标题】:How to upload MultipartFormData with authentication using Alamofire 【发布时间】:2015-12-19 21:02:07 【问题描述】:如何上传 MultipartFormData
并使用 Alamofire 进行身份验证?我不明白的部分是把.authenticate(user: username, password: password).
放在哪里?这就是我通常使用MultipartFormData
上传图片的方式:
Alamofire.upload(
.POST, "https://myExampleUrl/photo/upload", headers: headers, multipartFormData: multipartFormData in
multipartFormData.appendBodyPart(data: "default".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, name :"_formname")
multipartFormData.appendBodyPart(fileURL: fileUrl, name: "photo")
,
encodingCompletion: encodingResult in
switch encodingResult
case .Success(let upload, _, _):
upload.responseString response in
debugPrint(response)
case .Failure(let encodingError):
print(encodingError)
)
我认为可以将身份验证过程添加到标头中?
【问题讨论】:
我通常先让用户进行身份验证,然后在标头中发送会话令牌。 【参考方案1】:没有太多时间探索rilbits.com
的 API。当我在 Safari 中访问该地址时,出现以下错误:
Please add 'Authorization' or 'X-Access-Token' header to your request
这为您建议了 2 个选项:
-
首先登录并取回访问令牌,然后您可以将其用于上传请求
随上传请求一起发送基本的
Authorization
标头。
以下是发送Authorization
标头的方法(第二个选项):
let username = "username"
let password = "password"
let credentialData = "\(username):\(password)".dataUsingEncoding(NSUTF8StringEncoding)!
let base64Credentials = credentialData.base64EncodedStringWithOptions([])
let headers = ["Authorization": base64Credentials]
Alamofire.upload(
.POST,
"https://rilbits.com/supersafe/photo/upload",
headers: headers,
multipartFormData: multipartFormData in
let data = "default".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
multipartFormData.appendBodyPart(data: data, name: "_formname")
multipartFormData.appendBodyPart(fileURL: fileURL, name: "photo")
,
encodingCompletion: encodingResult in
switch encodingResult
case .Success(let upload, _, _):
upload.responseString response in
debugPrint(response)
case .Failure(let encodingError):
print(encodingError)
)
全面披露:
授权码是从Alamofire的readme中提取的 我没有测试上面的代码【讨论】:
这在 swift 3.0 中不起作用。对 swift 3.0 有什么建议吗? 这在 Alamofire 的最新版本 (4.0) 中不再有效。因为上传函数中的header参数已经不存在了。请问有什么想法吗? Alamofire 4 中的音频文件怎么样? - 我尝试以这种形式发送音频文件:multipartFormData.append(audioLocalPath, withName: "file", fileName: "file", mimeType: "application/octet-stream") 但出现此错误:multipartEncodingFailed(Alamofire.AFError .MultipartEncodingFailureReason.bodyPartFileNotReachableWithError(file:///var/mobile/Containers/......./Documents/item.mp3, NSUnderlyingError=0x16049100 Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory" )) - 问题出在哪里? - 错误的请求或错误的音频路径? @JayVDiyk 在4.4.0,参数好像又回来了。【参考方案2】:Alamofire.upload
这里并没有真正上传:它只是将多部分请求写入文件。
当您在encodingCompletion
中对upload
调用.responseX
时,那是实际执行请求的时间。也就是说,
upload.authenticate(user: username, password: password)
.responseString ...
应该做你想做的。
如果您使用标头进行身份验证,设置Alamofire.upload
的headers
参数应该仍然有效;据我所知,它应该将标题转发到upload
。您可以通过将upload
转储到控制台来验证这一点,也可以像处理普通请求一样将标头设置为upload
。
【讨论】:
以上是关于如何使用 Alamofire 上传具有身份验证的 MultipartFormData的主要内容,如果未能解决你的问题,请参考以下文章
当 Alamofire 请求通过身份验证时,我应该如何注销?
如何在 swift 5 中使用 alamofire 对登录到我的 iOS 应用程序的用户进行身份验证?
在 authManger.Login wapper 函数中实现关闭以进行 Alamofire 身份验证?