如何使用 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.uploadheaders 参数应该仍然有效;据我所知,它应该将标题转发到upload。您可以通过将upload 转储到控制台来验证这一点,也可以像处理普通请求一样将标头设置为upload

【讨论】:

以上是关于如何使用 Alamofire 上传具有身份验证的 MultipartFormData的主要内容,如果未能解决你的问题,请参考以下文章

具有 Alamofire 下载功能的 JWT 身份验证

当 Alamofire 请求通过身份验证时,我应该如何注销?

如何在 swift 5 中使用 alamofire 对登录到我的 iOS 应用程序的用户进行身份验证?

在 authManger.Login wapper 函数中实现关闭以进行 Alamofire 身份验证?

如何在 Swift 4 中使用 Alamofire 上传具有其他参数的多个图像

使用 Swift 4 和 Alamofire 获取客户端证书以用于 Https 调用身份验证