我正在将图像上传到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博客系列(Part 2Part 3)和Amazon Cognito Developer Guide是您理解和设置Cognito身份的重要资源。

    10-04 21:25
    查看更多