【问题标题】:Error downloading from S3 bucket on IOS.从 IOS 上的 S3 存储桶下载时出错。
【发布时间】:2016-08-26 17:05:19
【问题描述】:

我很难下载已上传到我的 S3 存储桶中的特定文件。

我创建了一个名为“Photos”的存储桶并上传了名为“test.png”的文件

在我的 AppDelegate 中设置我的 CredentialProvider 后,我尝试使用以下代码下载该文件:

    let transferManager = AWSS3TransferManager.defaultS3TransferManager()

    let downloadingFilePath = NSTemporaryDirectory().stringByAppendingString("test.png")
    let downloadingFileUrl = NSURL(fileURLWithPath: downloadingFilePath)
    let downloadRequest = AWSS3TransferManagerDownloadRequest()
    downloadRequest.bucket = "photos"
    downloadRequest.key = "test.png"
    downloadRequest.downloadingFileURL = downloadingFileUrl
    transferManager.download(downloadRequest).continueWithExecutor(AWSExecutor.mainThreadExecutor(), withBlock: { (AWSTask) -> AnyObject! in

        //Handle errors
        if AWSTask.error != nil
        {

            print("Error downloading: \(AWSTask.error)")

            // Retrive information important for later downloading
        }
        else
        {
            print("Download succesful..")
            var uploadResult: AnyObject! = AWSTask.result
            print("Upload result: \(uploadResult)")

            let downloadOutput = AWSTask.result as! AWSS3TransferManagerDownloadOutput                

        }
        return nil

    })

但它一直给我错误:“您尝试访问的存储桶必须使用指定的端点进行寻址。请将所有未来的请求发送到此端点”

我尝试将我的 downloaderRequest.bucket 更改为我在存储桶属性中找到的端点。 downloaderRequest.bucket = "photos.s3-website-sa-east-1.amazonaws.com"

但现在它说“指定的存储桶不存在,Code=NoSuchBucket”

对我做错了什么有任何想法吗?谢谢。

【问题讨论】:

  • 我遇到了同样的问题!我希望这里有人帮助我们。

标签: ios swift amazon-s3 awss3transfermanager


【解决方案1】:

下载前,请先设置好访问AWS服务所需的所有信息,请先在您的应用委托中应用以下代码,

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.

    let credentialsProvider = AWSStaticCredentialsProvider(accessKey: YOUR_AWS_ACCESS_KEY, secretKey: YOUR_AWS_SECRET_KEY)
    let defaultServiceConfiguration = AWSServiceConfiguration(region: AWSRegionType.SAEast1, credentialsProvider: credentialsProvider) //Your region endpoint
    AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = defaultServiceConfiguration

    AWSLogger.defaultLogger().logLevel = .Verbose
    return true
}

注意:请注意区分大小写的存储桶名称拼写。

 func downloadFile()
 {
            let transferManager = AWSS3TransferManager.defaultS3TransferManager()
            let downloadingFilePath = NSTemporaryDirectory().stringByAppendingString("test.png")
            let downloadingFileURL = NSURL(fileURLWithPath: downloadingFilePath as String )

            let downloadReadRequest : AWSS3TransferManagerDownloadRequest = AWSS3TransferManagerDownloadRequest()
            downloadReadRequest.bucket = "photos"
            downloadReadRequest.key =  "test.png"
            downloadReadRequest.downloadingFileURL = downloadingFileURL

            let task = transferManager.download(downloadReadRequest)
            task.continueWithBlock { (task) -> AnyObject? in

                if task.error != nil
                {
                    // Success
                }
                else
                {
                    // Error
                }  
             return nil
            }
}

【讨论】:

  • 我确实尝试使用我的 AWS_ACCESS_KEY 和 AWS_SECRET_KEY 但它仍然不起作用......我也尝试使用 Cognito 但它仍然不起作用。 "指定的bucket不存在,Code=NoSuchBucket"
  • 还有什么错误?请再次检查我的答案,因为我用另外一个功能对其进行了编辑。
  • 我做了你所说的一切,但我仍然得到“你试图访问的存储桶必须使用指定的端点来处理。请将所有未来的请求发送到这个端点”
  • @HenriquedaCosta 它在我身边使用最新的 AWS 开发工具包运行良好。因为我正在使用 pod 文件。我认为您应该尝试我的代码来安装 pod 文件。
  • 我正在导入以下内容: pod 'AWSCognito' pod 'AWSCore' pod 'AWSS3' 我看到人们只是在导入类似 pod 'AWSSDKv2' 之类的东西。是你用的那个吗?
【解决方案2】:

我终于明白了。 所以这里的问题是我在南美地区创建了我的存储桶,而亚马逊找不到它。 甚至认为当我单击我的亚马逊区域时,它会告诉我“S3 不需要选择区域”。您需要在“美国标准”中创建它。

【讨论】:

    【解决方案3】:

    出现这个问题是因为我们在配置 s3 时使用的 s3 存储桶和区域的区域不匹配 这是代码:

    let credentialsProvider = AWSCognitoCredentialsProvider(regionType: cognitoRegion,
                                                                    identityPoolId: cognitoIdentityPoolId,
                                                                    identityProviderManager: customIdentityProvider)
    

    所以,这里的区域类型必须与您的存储桶区域类型相同。前任。

    如果这是您的存储桶,那么您在代码中的区域类型必须是:AWSRegionType.APSouth1

    【讨论】:

      猜你喜欢
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 2021-05-23
      • 1970-01-01
      • 2012-01-29
      相关资源
      最近更新 更多