适用于 iOS 的 AWSS3TransferUtility 不起作用(虽然是 AWSS3TransferManager)

Eug*_*ene 4 amazon-s3 ios swift aws-sdk

我之前使用 AWSS3TransferManager 将图像上传到我的 s3 存储桶并且一切正常,但我认为后台上传是必要的,因此决定切换到 AWSS3TransferUtilityManager。我已经完全按照指南中所示实现了代码,但上传从未开始:

实例化 AWS 代码(在应用程序委托中 - didFinishLaunching...):

    //AWS SDK
    let credentialsProvider = AWSCognitoCredentialsProvider(regionType: AWSRegionType.USEast1, identityPoolId: "my_pool_id")        
    let configuration = AWSServiceConfiguration(region: AWSRegionType.USWest1, credentialsProvider: credentialsProvider)
    AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration
Run Code Online (Sandbox Code Playgroud)

设置临时目录以保存图像以供上传:

        //Set up and potentially clear temporary image directory before uploading
        let path = (NSTemporaryDirectory() as NSString).stringByAppendingPathComponent("image.png")
        let thumbnailUrl = NSURL(fileURLWithPath: path)

        var error: NSError? = nil
        if NSFileManager.defaultManager().fileExistsAtPath(thumbnailUrl.path!) {
            do {
                try NSFileManager.defaultManager().removeItemAtPath(thumbnailUrl.path!)
                print("Successfully cleared temporary directory")

            } catch let fileError as NSError {
                error = fileError
                print("Error clearing temporary image directory")
            }
        }
Run Code Online (Sandbox Code Playgroud)

设置 Transfer Utility 表达式:

        let expression:AWSS3TransferUtilityUploadExpression = AWSS3TransferUtilityUploadExpression()
Run Code Online (Sandbox Code Playgroud)

进度更新代码:

        //-------------------------
        //Progress Bar Update
        expression.progressBlock = { (task: AWSS3TransferUtilityTask,progress: NSProgress) -> Void in
            dispatch_async(dispatch_get_main_queue(),{

                print("Image upload progress update: \(progress.fractionCompleted)")

            })
        }
Run Code Online (Sandbox Code Playgroud)

将 ACL 标记为公共

        //Mark ACL as public
        expression.setValue("public-read", forRequestParameter: "x-amz-acl")
        expression.setValue("public-read", forRequestHeader: "x-amz-acl" )
Run Code Online (Sandbox Code Playgroud)

完成处理程序代码:

        //-------------------------
        //Completion handler
        self.imageUploadCompletionHandler = { (task:AWSS3TransferUtilityUploadTask, error:NSError?) -> Void in

            print("Image upload complete")

            dispatch_async(dispatch_get_main_queue(), {

                if(error != nil){
                    print("Failure uploading thumbnail")

                }else{
                    print("Success uploading thumbnail")
                }

            })
        }
Run Code Online (Sandbox Code Playgroud)

上传:

        //--------------------------
        //Upload Thumbnail
        AWSS3TransferUtility.defaultS3TransferUtility().uploadFile(thumbnailUrl, bucket: "exampleBucket", key: "exampleKey", contentType: "image/jpeg", expression: expression, completionHander: self.imageUploadCompletionHandler).continueWithBlock({ (task:AWSTask) -> AnyObject? in

            if(task.error != nil){
                print("Error uploading thumbnail: \(task.error)")
                s3RequestSuccessful = false

            }

            if(task.exception != nil){
                print("Exception uploading thumbnail: \(task.exception)")
                s3RequestSuccessful = false

            }

            if(task.result != nil){
                print("Starting upload...")
            }
            return nil
        })
Run Code Online (Sandbox Code Playgroud)

所以我的存储桶在 US-West-1,身份池在 US-East-1,我知道有一些关于确保存储桶和身份池在同一区域的帖子,但应该注意以下是我实施的行:

 let configuration = AWSServiceConfiguration(region: AWSRegionType.USWest1, credentialsProvider: credentialsProvider)
Run Code Online (Sandbox Code Playgroud)

我得到的行为是永远不会调用完成处理程序和进度块代码。我在这里缺少什么?再一次,使用 AWSS3TransferManager 可以完美地上传到同一个存储桶

Eug*_*ene 6

通过反复试验并从 AWS 论坛中获得一些灵感来解决这个问题。显然 AWSS3TransferUtilityManager 不适用于名称中包含特殊字符的存储桶(在我的情况下为破折号)。令人沮丧,因为这不是 AWSS3TransferManager 的问题。