首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于iOS的AWSS3TransferUtility不起作用(但AWSS3TransferManager起作用)

用于iOS的AWSS3TransferUtility不起作用(但AWSS3TransferManager起作用)
EN

Stack Overflow用户
提问于 2016-09-07 03:57:05
回答 2查看 5.2K关注 0票数 5

我之前使用AWSS3TransferManager上传图片到我的s3存储桶,一切都很完美,但我认为后台上传是必要的,所以决定切换到AWSS3TransferUtilityManager。我已经完全按照指南中所示的方式实现了代码,但上载从未开始:

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

代码语言:javascript
复制
    //AWS SDK
    let credentialsProvider = AWSCognitoCredentialsProvider(regionType: AWSRegionType.USEast1, identityPoolId: "my_pool_id")        
    let configuration = AWSServiceConfiguration(region: AWSRegionType.USWest1, credentialsProvider: credentialsProvider)
    AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration

设置保存图片的临时目录,以便上传:

代码语言:javascript
复制
        //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")
            }
        }

设置传输实用程序表达式:

代码语言:javascript
复制
        let expression:AWSS3TransferUtilityUploadExpression = AWSS3TransferUtilityUploadExpression()

进度更新代码:

代码语言:javascript
复制
        //-------------------------
        //Progress Bar Update
        expression.progressBlock = { (task: AWSS3TransferUtilityTask,progress: NSProgress) -> Void in
            dispatch_async(dispatch_get_main_queue(),{

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

            })
        }

将ACL标记为公共

代码语言:javascript
复制
        //Mark ACL as public
        expression.setValue("public-read", forRequestParameter: "x-amz-acl")
        expression.setValue("public-read", forRequestHeader: "x-amz-acl" )

完成处理程序代码:

代码语言:javascript
复制
        //-------------------------
        //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")
                }

            })
        }

上传:

代码语言:javascript
复制
        //--------------------------
        //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
        })

所以我的存储桶在US-West-1,身份池在US-East-1,我知道有一些关于确保存储桶和身份池在同一区域的帖子,但这应该通过我实现的以下代码来处理:

代码语言:javascript
复制
 let configuration = AWSServiceConfiguration(region: AWSRegionType.USWest1, credentialsProvider: credentialsProvider)

我得到的行为是完成处理程序和进度块代码从未被调用过。这里我漏掉了什么?再一次,使用AWSS3TransferManager将文件上传到同一个存储桶中

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-07 08:53:34

通过深入研究试验和错误,以及来自AWS论坛的一些灵感,找到了答案。显然,AWSS3TransferUtilityManager不能处理名称中包含特殊字符(在我的例子中是破折号)的存储桶。令人沮丧,因为这不是AWSS3TransferManager的问题。

票数 6
EN

Stack Overflow用户

发布于 2020-01-31 21:07:37

我试过你的代码,看起来很适合我。

代码语言:javascript
复制
task.exception != nil

不起作用,所以就把它去掉吧。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39356877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档