Xernox Xernox - 19 days ago 7
iOS Question

How to upload MultipartFormData with authentication using Alamofire

How to upload

MultipartFormData
with authentication using Alamofire? The part that I don't understand is where to put
.authenticate(user: username, password: password).
? This is how I usually upload pictures using
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)
}
}
)


I think it's possible to add authentication process into headers?

Answer

Haven't had much time to explore the API for rilbits.com. When I visited the address in Safari, I got the following error:

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

This suggests 2 options for you:

  1. Login first and get back an access token, which you can then use the for the upload request
  2. Send a basic Authorization header along with the upload request.

Here's how you can send the Authorization header (second option):

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)
        }
    }
)

Full disclosure:

  • The authorization code was lifted from Alamofire's readme
  • I didn't test the code above