如何使用Alamofire进行身份验证的MultipartFormData上传

3

如何使用Alamofire上传带有身份验证的MultipartFormData?我不明白的是在哪里放置.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)
            }
        }
    )

我认为可以在标题中添加身份验证过程?


我通常会让用户先进行身份验证,然后在头部中发送会话令牌。 - Marcos Griselli
2个回答

2

我没有太多时间去探索rilbits.com的API。当我在Safari中访问该地址时,我收到了以下错误:

Please add 'Authorization' or 'X-Access-Token' header to your request 

这为您提供了两个选项:
  1. 首先登录并获取访问令牌,然后可以将其用于上传请求。
  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 的 自述文件
  • 我没有测试上述代码

2
这在Swift 3.0中不起作用。有关于Swift 3.0的任何建议吗? - Mitul Marsoniya
2
在Alamofire的最新版本(4.0)中,这个已经不再起作用了。因为上传函数中的头部参数已经不存在了。有什么想法吗? - JayVDiyk
在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“没有这个文件或目录”}})-问题出在哪里?-坏请求还是坏音频路径? - Saeid
@JayVDiyk 在4.4.0版本中,该参数似乎又回来了。 - Raphael

1

Alamofire.upload 并不会真正上传文件,它只是将多部分请求写入文件中。

当你在 encodingCompletion 中调用 upload 上的 .responseX 时,那时请求才会被实际执行。也就是说,

upload.authenticate(user: username, password: password)
      .responseString { ...}

应该做你想要的事情。

如果您使用标头进行身份验证,则设置 Alamofire.uploadheaders 参数仍然有效;据我所知,它应将标头转发到 upload。您可以通过将 upload 转储到控制台来验证这一点,并且您还可以像处理普通请求一样为 upload 设置标头。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接