Search code examples
swiftamazon-web-servicesamazon-s3file-upload

Upload file to S3 service 403 ERROR (com.amazonaws.AWSS3TransferUtilityErrorDomain error 2.) Swift iOS


I tried to upload my file to S3 service vie AWSS3 SDK swift. My code:


    let credentialsProvider = AWSStaticCredentialsProvider(accessKey: Config.main.accessKey, secretKey: Config.main.secretKey)
    let configuration = AWSServiceConfiguration(region: .USEast1, endpoint: AWSEndpoint(url: URL(string: Config.main.AWS_ENDPOINT)!), credentialsProvider: credentialsProvider)
    AWSServiceManager.default().defaultServiceConfiguration = configuration

let image = UIImage(named: "photo")!
let data: Data = image.pngData()!
let remoteName = generateRandomStringWithLength(length: 12) + "." + data.format
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let fileURL = documentsURL.appendingPathComponent(remoteName)
try! data.write(to: fileURL, options: .atomic)
upload(fileUrl: fileURL, fileData: data, fileName: remoteName, type: .image, completionHandler: {_ in})

func upload(fileUrl: URL, fileData: Data, fileName: String, type: FileTypes, completionHandler: @escaping (URL?) -> ()) {

    let expression = AWSS3TransferUtilityUploadExpression()
    expression.progressBlock = { task, progress in
        DispatchQueue.main.async {
            print("Progress = \(progress.completedUnitCount)/\(progress.totalUnitCount)")
        }
    }
    let util = AWSS3TransferUtility.default()
    util.uploadData(
        fileData,
        bucket: self.getBucket(type: type),
        key: "\(self.getDir(type: type))_\(fileName)",
        contentType: "image/png",
        expression: expression) { task, error in
            print("ERROR: \(error?.localizedDescription)")
            print("response: \(task.response)")
            print("response: \(task.response)")

        }.continueWith { task in
            if let error = task.error {
                print("ERROR1: \(error.localizedDescription)")
            }
            return nil
    }
}

It returns me something like 5 times progress response and after that

ERROR: Optional("The operation couldn’t be completed. (com.amazonaws.AWSS3TransferUtilityErrorDomain error 2.)")

response: Optional( { URL: http://(bucket).(host)/image_L24i8RGCeAaj.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=59589007eea780cf27c5%2F20200131%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20200131T125453Z&X-Amz-Expires=2999&X-Amz-SignedHeaders=content-type%3Bhost&X-Amz-Signature=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx } { Status Code: 403, Headers { "Content-Length" = ( 186 ); Date = ( "Fri, 31 Jan 2020 12:54:53 GMT" ); Server = ( LeoFS ); } })

Android app with same setup works perfect.

What is the solution of the problem?


Solution

  • I was having same issue. Everything was working fine on android, While IOS was not working with same configuration.

    Then I contacted AWS support, and they told me iPhones Date and time is wrong. I just adjusted date and time to correct date and time and then tried to upload and it worked.