将图像上传到 S3 无法完成上传
Uploading Image to S3 fails to complete upload
我正在将图像上传到 S3,但无法完成文件传输。以下是该应用程序的运行方式。
- 发起
uploadToS3()
- 文件开始传输并向服务器发送字节。
- 发送大约 600,000 字节后,上传停止。
- 20-40 秒后,应用继续以 0% 的速度上传。就好像文件传输从一开始就没有开始过一样。
- 在此期间,记录器中没有出现任何错误。
在我的视图控制器中,我有以下上传文件的方法。
func uploadToS3(){
// get the image from a UIImageView that is displaying the selected Image
var img: UIImage = imageView.image!
// create a local image that we can use to upload to s3
var path: NSString = NSTemporaryDirectory().stringByAppendingPathComponent("image.png")
var imageData: NSData = UIImagePNGRepresentation(img)
imageData.writeToFile(path as String, atomically: true)
// once the image is saved we can use the path to create a local fileurl
var url:NSURL = NSURL(fileURLWithPath: path as String)!
// next we set up the S3 upload request manager
let uploadRequest = AWSS3TransferManagerUploadRequest()
// set the bucket
uploadRequest?.bucket = "test-bucket"
// I want this image to be public to anyone to view it so I'm setting it to Public Read
uploadRequest?.ACL = AWSS3ObjectCannedACL.PublicRead
// set the image's name that will be used on the s3 server. I am also creating a folder to place the image in
uploadRequest?.key = "foldername/image.png"
// set the content type
uploadRequest?.contentType = "image/png"
// and finally set the body to the local file path
uploadRequest?.body = url;
// we will track progress through an AWSNetworkingUploadProgressBlock
uploadRequest?.uploadProgress = {[unowned self](bytesSent:Int64, totalBytesSent:Int64, totalBytesExpectedToSend:Int64) in
dispatch_sync(dispatch_get_main_queue(), { () -> Void in
println("total bytes sent")
println(totalBytesSent)
println("total bytes expected to send")
println(totalBytesExpectedToSend)
})
}
// now the upload request is set up we can creat the transfermanger, the credentials are already set up in the app delegate
var transferManager:AWSS3TransferManager = AWSS3TransferManager.defaultS3TransferManager()
// start the upload
transferManager.upload(uploadRequest).continueWithExecutor(BFExecutor.mainThreadExecutor(), withBlock:{ [unowned self]
task -> AnyObject in
// once the uploadmanager finishes check if there were any errors
if(task.error != nil){
println("%@", task.error);
}else{ // if there aren't any then the image is uploaded!
// this is the url of the image we just uploaded
println("https://s3.amazonaws.com/s3-demo-swift/foldername/image.png");
}
//self.removeLoadingView()
println("all done");
return ""
})
}
对于任何想要重新创建此应用程序的人
添加到您的 Podfile:
pod 'AWSCore'
pod 'AWSS3'
pod 'AWSiOSSDKv2'
pod 'AWSCognitoSync'
然后添加一个桥头包含:
#import <AWSCore/AWSCore.h>
#import <AWSS3/AWSS3.h>
在我的 AppDelegate
我有:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
AWSCognitoCredentialsProvider.initialize()
var credentialsProvider = AWSCognitoCredentialsProvider(
regionType: AWSRegionType.USEast1,
identityPoolId: "identity pool id"
)
var configuration = AWSServiceConfiguration(
region: AWSRegionType.USEast1,
credentialsProvider: credentialsProvider
)
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration
return true
}
最后,在包含uploadToS3()
的视图控制器中,添加import AWSS3
。
更新
这是记录错误的最后一部分。
}]
2015-05-09 19:24:24.540 CoolApp[4492:55681] AWSiOSSDKv2 [Verbose] AWSURLResponseSerialization.m line:278 | -[AWSXMLResponseSerializer responseObjectForResponse:originalRequest:currentRequest:data:error:] | Response body: [<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>A03D405FC272808A</RequestId><HostId>bhSw+xQkGrMVd9QWMKMG1qYezPJet8b5L2ZIoGXePoftuupMP3HdgbAgCpStiLefo5yA3m1OJvY=</HostId></Error>]
(%@, Error Domain=com.amazonaws.AWSS3ErrorDomain Code=1 "The operation couldn’t be completed. (com.amazonaws.AWSS3ErrorDomain error 1.)" UserInfo=0x7c17cdc0 {HostId=bhSw+xQkGrMVd9QWMKMG1qYezPJet8b5L2ZIoGXePoftuupMP3HdgbAgCpStiLefo5yA3m1OJvY=, Code=AccessDenied, Message=Access Denied, RequestId=A03D405FC272808A})
all done
我的问题是,如何解决这个问题并成功上传图片。
如错误消息所述,您的 Amazon Cognito 身份池的权限设置不正确。 Understanding Amazon Cognito Authentication blog series (Part 2, Part 3) and Amazon Cognito Developer Guide 是您了解和设置 Cognito Identity 的重要资源。
我正在将图像上传到 S3,但无法完成文件传输。以下是该应用程序的运行方式。
- 发起
uploadToS3()
- 文件开始传输并向服务器发送字节。
- 发送大约 600,000 字节后,上传停止。
- 20-40 秒后,应用继续以 0% 的速度上传。就好像文件传输从一开始就没有开始过一样。
- 在此期间,记录器中没有出现任何错误。
在我的视图控制器中,我有以下上传文件的方法。
func uploadToS3(){
// get the image from a UIImageView that is displaying the selected Image
var img: UIImage = imageView.image!
// create a local image that we can use to upload to s3
var path: NSString = NSTemporaryDirectory().stringByAppendingPathComponent("image.png")
var imageData: NSData = UIImagePNGRepresentation(img)
imageData.writeToFile(path as String, atomically: true)
// once the image is saved we can use the path to create a local fileurl
var url:NSURL = NSURL(fileURLWithPath: path as String)!
// next we set up the S3 upload request manager
let uploadRequest = AWSS3TransferManagerUploadRequest()
// set the bucket
uploadRequest?.bucket = "test-bucket"
// I want this image to be public to anyone to view it so I'm setting it to Public Read
uploadRequest?.ACL = AWSS3ObjectCannedACL.PublicRead
// set the image's name that will be used on the s3 server. I am also creating a folder to place the image in
uploadRequest?.key = "foldername/image.png"
// set the content type
uploadRequest?.contentType = "image/png"
// and finally set the body to the local file path
uploadRequest?.body = url;
// we will track progress through an AWSNetworkingUploadProgressBlock
uploadRequest?.uploadProgress = {[unowned self](bytesSent:Int64, totalBytesSent:Int64, totalBytesExpectedToSend:Int64) in
dispatch_sync(dispatch_get_main_queue(), { () -> Void in
println("total bytes sent")
println(totalBytesSent)
println("total bytes expected to send")
println(totalBytesExpectedToSend)
})
}
// now the upload request is set up we can creat the transfermanger, the credentials are already set up in the app delegate
var transferManager:AWSS3TransferManager = AWSS3TransferManager.defaultS3TransferManager()
// start the upload
transferManager.upload(uploadRequest).continueWithExecutor(BFExecutor.mainThreadExecutor(), withBlock:{ [unowned self]
task -> AnyObject in
// once the uploadmanager finishes check if there were any errors
if(task.error != nil){
println("%@", task.error);
}else{ // if there aren't any then the image is uploaded!
// this is the url of the image we just uploaded
println("https://s3.amazonaws.com/s3-demo-swift/foldername/image.png");
}
//self.removeLoadingView()
println("all done");
return ""
})
}
对于任何想要重新创建此应用程序的人
添加到您的 Podfile:
pod 'AWSCore'
pod 'AWSS3'
pod 'AWSiOSSDKv2'
pod 'AWSCognitoSync'
然后添加一个桥头包含:
#import <AWSCore/AWSCore.h>
#import <AWSS3/AWSS3.h>
在我的 AppDelegate
我有:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
AWSCognitoCredentialsProvider.initialize()
var credentialsProvider = AWSCognitoCredentialsProvider(
regionType: AWSRegionType.USEast1,
identityPoolId: "identity pool id"
)
var configuration = AWSServiceConfiguration(
region: AWSRegionType.USEast1,
credentialsProvider: credentialsProvider
)
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration
return true
}
最后,在包含uploadToS3()
的视图控制器中,添加import AWSS3
。
更新
这是记录错误的最后一部分。
}]
2015-05-09 19:24:24.540 CoolApp[4492:55681] AWSiOSSDKv2 [Verbose] AWSURLResponseSerialization.m line:278 | -[AWSXMLResponseSerializer responseObjectForResponse:originalRequest:currentRequest:data:error:] | Response body: [<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>A03D405FC272808A</RequestId><HostId>bhSw+xQkGrMVd9QWMKMG1qYezPJet8b5L2ZIoGXePoftuupMP3HdgbAgCpStiLefo5yA3m1OJvY=</HostId></Error>]
(%@, Error Domain=com.amazonaws.AWSS3ErrorDomain Code=1 "The operation couldn’t be completed. (com.amazonaws.AWSS3ErrorDomain error 1.)" UserInfo=0x7c17cdc0 {HostId=bhSw+xQkGrMVd9QWMKMG1qYezPJet8b5L2ZIoGXePoftuupMP3HdgbAgCpStiLefo5yA3m1OJvY=, Code=AccessDenied, Message=Access Denied, RequestId=A03D405FC272808A})
all done
我的问题是,如何解决这个问题并成功上传图片。
如错误消息所述,您的 Amazon Cognito 身份池的权限设置不正确。 Understanding Amazon Cognito Authentication blog series (Part 2, Part 3) and Amazon Cognito Developer Guide 是您了解和设置 Cognito Identity 的重要资源。