ios - 无法让 S3 上传在 Xcode 10.2/Swift 中工作

标签 ios swift xcode amazon-web-services amazon-s3

我正在构建一个 iOS 应用程序,几天来我一直停留在 S3 上传上。我一直在关注此处提供的文档:

https://aws-amplify.github.io/docs/ios/storage

当我点击这个函数时,Xcode 中似乎一切正常,并且没有返回任何错误。然而,当我查看我的 S3 存储桶时,我发现该图像从未上传。这是我的上传功能(我也将凭据信息放在这里):

我认为我的困惑来自于从 Cognito 获取凭证。我觉得我需要 Cognito 凭证才能访问 AWS Transfer Utility,下面的代码似乎应该执行此操作?

@IBAction func uploadData() {

    let pool = AWSCognitoIdentityUserPool(forKey: "UserPool")
    let credentialsProvider = AWSCognitoCredentialsProvider(regionType: .USEast2, identityPoolId: "us-east-2:XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX", identityProviderManager:pool)
    let serviceConfiguration = AWSServiceConfiguration(region: .USEast2, credentialsProvider: credentialsProvider)
    let userPoolConfiguration = AWSCognitoIdentityUserPoolConfiguration(clientId: "XXXX", clientSecret: "XXXX", poolId: "us-east-XXXX")

    let tu = AWSS3TransferUtilityConfiguration()

    AWSS3TransferUtility.register(with: serviceConfiguration!, transferUtilityConfiguration: tu, forKey: "UserPool")

    let transferUtility:(AWSS3TransferUtility?) = AWSS3TransferUtility.s3TransferUtility(forKey: "UserPool")
    AWSServiceManager.default()?.defaultServiceConfiguration = serviceConfiguration


    let data = self.imageView?.image?.pngData() // Data to be uploaded

    let expression = AWSS3TransferUtilityUploadExpression()
    expression.progressBlock = {(task, progress) in
        DispatchQueue.main.async(execute: {
            // Do something e.g. Update a progress bar.
        })
    }

    var completionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock?
    completionHandler = { (task, error) -> Void in
        DispatchQueue.main.async(execute: {
            // Do something e.g. Alert a user for transfer completion.
            // On failed uploads, `error` contains the error object.
        })
    }

    transferUtility!.uploadData(data as! Data,
                               bucket: "mybucket-env",
                               key: "YourFileName",
                               contentType: "image/png",
                               expression: expression,
                               completionHandler: completionHandler).continueWith {
                                (task) -> AnyObject? in
                                if let error = task.error {
                                    print("Error: \(error.localizedDescription)")
                                }

                                if let _ = task.result {
                                    // Do something with uploadTask.
                                }
                                return nil;
    }
}

最佳答案

文档已更新:https://aws-amplify.github.io/docs/ios/storage

您可以使用 AWS Amplify 实现相同的功能,您可以使用

  1. 增强 CLI 以配置 S3 和认知资源

  2. 将配置文件添加到您的应用:awsconfiguration.jsonamplifyconfiguration.json

  3. 安装依赖项

pod 'AmplifyPlugins/AWSS3StoragePlugin'
pod 'AWSMobileClient', '~> 2.12.0'
  • 初始化 AWSMobileClient 和 Amplify

  • Amplify.Storage.uploadData()

  • 关于ios - 无法让 S3 上传在 Xcode 10.2/Swift 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55443508/

    相关文章:

    ios - 使用 setViewControllers 时,viewWillAppear、viewDidAppear 和 viewWillDisappear 不会在 iOS 5 上被调用

    ios - 当应用程序在后台且本地通知触发时执行代码

    ios - 访问 UITableView 标题 View

    arrays - 尝试用 Argo 解码数组

    ios - 使我的 UIView 可滚动

    ios - 如何用动画折叠tableview?

    ios - XCUITest - 如何模拟设备的锁定

    ios - 快速删除对象数组中的重复元素

    xcode - 如何初始化相互依赖的属性

    ios - 在 Swift 中获取图像名称 UIImagePickerController