Загрузить файл в службу S3 403 ОШИБКА (ошибка com.amazon aws .AWSS3TransferUtilityErrorDomain 2.) Swift iOS - PullRequest
0 голосов
/ 31 января 2020

Я пытался загрузить свой файл в службу S3 v ie AWSS3 SDK swift. Мой код:


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

Он возвращает мне примерно 5-кратный прогресс, и после этого

ОШИБКА: Необязательно ("Операция не может не будет завершено. (com.amazon aws .AWSS3TransferUtilityErrorDomain error 2.) ")

ответ: Необязательно ({URL: http: // (корзина). (хост) / image_L24i8RGCeAaj. PNG? X-Amz-Algorithm = AWS4-HMA C -SHA256 & X-Amz-Credential = 59589007eea780cf27c5% 2F20200131% 2Fus-восток-1% 2Fs3% 2Faws4_request & X-Amz-Date = 20200131T125453Z & X-Amz-Истекает = 2999 & X-АМЗ-SignedHeaders = тип контента% 3Bhost & X-Amz-Signature = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx } {Код состояния: 403, заголовки {"Content-Length" = (186); Дата = ("Пт, 31 января 2020 12:54:53 GMT") ); Server = (LeoFS);}})

Android Приложение с такой же настройкой отлично работает.

Какое решение проблемы?

Ответы [ 2 ]

1 голос
/ 31 января 2020

привет, если вы не используете пользовательские конечные точки, измените эту строку:

let configuration = AWSServiceConfiguration(region: .USEast1, endpoint: AWSEndpoint(url: URL(string: Config.main.AWS_ENDPOINT)!), credentialsProvider: credentialsProvider)

на:

let configuration = AWSServiceConfiguration(region: .USEast1, credentialsProvider: credentialsProvider)

и будет работать просто отлично. SDK может разрешить конечную точку службы без предоставления конечной точки. Вам нужно предоставить конечную точку, только если вы используете пользовательские конечные точки. Здесь также стоит отметить, что если вы действительно хотите передать конечную точку, вам нужно убедиться, что вы передаете правильную конечную точку, а us-east-1 для s3 имеет специальную конечную точку, которая не включает регион, как показано ниже:

let configuration = AWSServiceConfiguration(region: .USEast1,endpoint: AWSEndpoint(url: URL(string: "https://s3.amazonaws.com")) , credentialsProvider: credentialsProvider)

0 голосов
/ 18 февраля 2020

Есть некоторая полезная информация об этом в https://medium.com/@lewisjkl / signature-aws4-31dcff1bf1f0 , от Джеффа Льюиса.

Используется библиотека CryptoSwift; Я работаю сейчас, чтобы преобразовать его, чтобы использовать новый CryptoKit.

...