iOS 的 AWSS3TransferUtility 不工作(虽然 AWSS3TransferManager 是)
AWSS3TransferUtility for iOS not working (AWSS3TransferManager is though)
我之前使用 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
设置临时目录以保存图像以供上传:
//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")
}
}
设置传输实用程序表达式:
let expression:AWSS3TransferUtilityUploadExpression = AWSS3TransferUtilityUploadExpression()
进度更新码:
//-------------------------
//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 标记为 public
//Mark ACL as public
expression.setValue("public-read", forRequestParameter: "x-amz-acl")
expression.setValue("public-read", forRequestHeader: "x-amz-acl" )
完成处理程序代码:
//-------------------------
//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")
}
})
}
上传:
//--------------------------
//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,我知道有一些关于确保存储桶和身份池在同一区域的帖子,但应该是处理了我已经实施的以下行:
let configuration = AWSServiceConfiguration(region: AWSRegionType.USWest1, credentialsProvider: credentialsProvider)
我得到的行为是从未调用完成处理程序和进度块代码。我在这里错过了什么?再次使用 AWSS3TransferManager
将 were/are 完美上传到同一个存储桶
通过反复试验和 AWS 论坛的一些启发来弄明白。显然 AWSS3TransferUtilityManager 不适用于名称中包含特殊字符的存储桶(在我的例子中是破折号)。令人沮丧,因为这不是 AWSS3TransferManager 的问题。
试过你的代码,对我来说似乎工作正常。
task.exception != nil
虽然不起作用,所以只需删除它即可。
我之前使用 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
设置临时目录以保存图像以供上传:
//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")
}
}
设置传输实用程序表达式:
let expression:AWSS3TransferUtilityUploadExpression = AWSS3TransferUtilityUploadExpression()
进度更新码:
//-------------------------
//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 标记为 public
//Mark ACL as public
expression.setValue("public-read", forRequestParameter: "x-amz-acl")
expression.setValue("public-read", forRequestHeader: "x-amz-acl" )
完成处理程序代码:
//-------------------------
//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")
}
})
}
上传:
//--------------------------
//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,我知道有一些关于确保存储桶和身份池在同一区域的帖子,但应该是处理了我已经实施的以下行:
let configuration = AWSServiceConfiguration(region: AWSRegionType.USWest1, credentialsProvider: credentialsProvider)
我得到的行为是从未调用完成处理程序和进度块代码。我在这里错过了什么?再次使用 AWSS3TransferManager
将 were/are 完美上传到同一个存储桶通过反复试验和 AWS 论坛的一些启发来弄明白。显然 AWSS3TransferUtilityManager 不适用于名称中包含特殊字符的存储桶(在我的例子中是破折号)。令人沮丧,因为这不是 AWSS3TransferManager 的问题。
试过你的代码,对我来说似乎工作正常。
task.exception != nil
虽然不起作用,所以只需删除它即可。