ios - 将图像上传到 S3 无法完成上传

标签 ios swift amazon-web-services amazon-s3 image-uploading

我正在将图像上传到 S3,但无法完成文件传输。以下是该应用的行为方式。

  1. 启动uploadToS3()
  2. 文件开始传输,向服务器发送字节。
  3. 当发送了大约 600,000 个字节时,上传停止。
  4. 20-40 秒后,应用继续以 0% 的速度上传。就好像文件传输从一开始就没有开始过一样。
  5. 在此期间,记录器中没有出现任何错误。

在我的 View Controller 中,我有以下上传文件的方法。

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() 的 View Controller 中,添加 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 Identity 的重要资源。

关于ios - 将图像上传到 S3 无法完成上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30043782/

相关文章:

ios - 根据命令连续加载 CustomViewControllers

ios - 我们如何在 xCode iOS 中隐藏敏感数据

ios - ADMOB 内存泄漏?

ios - SIGABRT : Precondition failure: imported node deleted before its value was read

ios - swift 3 : How to set multiple cookies for JWPlayer for HLS Streaming

amazon-web-services - 需要定期更新时使用 Dynamo 表的最佳实践

ios - 从另一个 View Controller 访问数组数据

ios - 占位符文本未显示在文本编辑器上

ios - Realm - 删除后无法使用对象

java - 我无法比较 DynamoDB 中的两个不同属性吗?