Search code examples
iosswiftalamofire

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?


Solution

  • 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