2016-03-22 11 views
2

イメージをs3にアップロードしようとしましたが、その理由は不明のため毎回失敗します。AWS iOS SDKでのS3アップロードが毎回失敗する

private func uploadImageToS3(withS3Path s3path: String, image: UIImage, progress: (Float -> Void)?) -> BFTask{ 
    let path: NSString = NSTemporaryDirectory().stringByAppendingString("profile_image.jpg") 
    let imageData = UIImageJPEGRepresentation(image, 0.8) 
    imageData?.writeToFile(path as String, atomically: true) 

    let url: NSURL = NSURL(fileURLWithPath: path as String) 

    let uploadRequest = AWSS3TransferManagerUploadRequest() 
    uploadRequest.bucket = "my_bucket" 
    uploadRequest.key = s3path 
    uploadRequest.contentType = "image/jpg" 
    uploadRequest.body = url 

    let transferManager = CognitoCredentialProvider.sharedInstance.s3TransferManager 
    let completionSource = BFTaskCompletionSource() 
    transferManager.upload(uploadRequest).continueWithExecutor(AWSExecutor.mainThreadExecutor(), withBlock: {(task:AWSTask!) in 
     if task.error != nil{ 
      completionSource.setError(task.error!) 
      return nil 
     }else{ 
      completionSource.setResult(s3path) 
     } 
     return nil 
    }) 
    return completionSource.task 
} 

アップロードは短時間で開始されますが失敗します。ログ:

Progress 0.126221

Progress 0.252442

Progress 0.378663

Progress 0.504884

AWSiOSSDKv2 [Error] AWSURLSessionManager.m line:260 | -[AWSURLSessionManager URLSession:task:didCompleteWithError:] | Session task failed with error: Error Domain=NSURLErrorDomain Code=-1017 "cannot parse response" UserInfo={NSUnderlyingError=0x7fda2f90e3c0 {Error Domain=kCFErrorDomainCFNetwork Code=-1017 "(null)" UserInfo={_kCFStreamErrorCodeKey=-1, _kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey= https://s3-us-west-2.amazonaws.com/my_bucket/profile_image/cognitoID/profile_image.jpg , NSErrorFailingURLKey= https://s3-us-west-2.amazonaws.com/my_bucket/profile_image/cognitoID/profile_image.jpg , _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-1, NSLocalizedDescription=cannot parse response}

転送マネージャの初期化:

let kclIdentityProvider = KCLCognitoIdentityProvider(regionType: .USEast1, identityPoolId: "poolID", userSession: UserSession.sharedInstance) 
    let cognitoCredProvider = AWSCognitoCredentialsProvider(regionType: .USEast1, identityProvider: kclIdentityProvider, unauthRoleArn: nil, authRoleArn: nil) 
    self.credProvider = cognitoCredProvider 
    let configuration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: cognitoCredProvider) 
    AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration 

    // s3, sns use uswest2 
    let usWest2 = AWSServiceConfiguration(region: AWSRegionType.USWest2, credentialsProvider: self.credProvider) 
    AWSS3TransferManager.registerS3TransferManagerWithConfiguration(usWest2, forKey: "USWest2S3") 
    AWSSNS.registerSNSWithConfiguration(usWest2, forKey: "USWest2SNS") 

    self.snsClient = AWSSNS(forKey: "USWest2SNS") 
    self.s3TransferManager = AWSS3TransferManager.S3TransferManagerForKey("USWest2S3") 

は私が何とかアップロードが失敗した理由に関する詳細な情報を得ることができますか?

答えて

0

コード-1017は、サーバーが有効なHTTP応答で応答していないことを意味します。より多くの情報を得るために、詳細ログを切り替えます。

私はS3にアップロードするには、以下の使用
AWSLogger.defaultLogger().logLevel = .Verbose 

import AWSS3 

/** Schedule an upload request to S3 for a UIImage 
    Parameter imageURL: NSURL to image location on the device 
    Parameter imageName: string with image name 
    Parameter imageFile: UIImage to be upload 
    Parameter bucketName: string name of the bucket 
    Return: AWSTask 
*/ 
func uploadImageToAWS (imageURL: NSURL, imageName: String, imageFile: UIImage, bucketName: String) -> AWSTask! { 
    // create a file location for image 
    UIImageJPEGRepresentation(imageFile, 1)!.writeToURL(imageURL, atomically: false) 

    // save image 
    let uploadRequest:AWSS3TransferManagerUploadRequest = AWSS3TransferManagerUploadRequest() 
    uploadRequest.bucket = bucketName 
    uploadRequest.key = imageName 
    uploadRequest.body = imageURL 
    uploadRequest.uploadProgress = { (bytesSent:Int64, totalBytesSent:Int64, totalBytesExpectedToSend:Int64) -> Void in 
     dispatch_sync(dispatch_get_main_queue(), {() -> Void in 
      print(totalBytesSent) 
     }) 
    } 

    return AWSS3TransferManager.defaultS3TransferManager().upload(uploadRequest) 
} 

そして、私のAppDelegate.swift中を:

let credentialProvider = AWSCognitoCredentialsProvider(
     regionType: CognitoRegionType, identityPoolId: cognitoIdentityPoolId)   

let configuration = AWSServiceConfiguration(
     region: DefaultServiceRegionType, 
     credentialsProvider: credentialProvider) 

AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration 

そして、AWSでIAMのコンソールでは、ポリシージェネレータを使用して、S3バケットのロールポリシー(Unauth)を作成します。あなたはS3管理コンソールでバケットの権限にバケットポリシーを追加する必要が最後に

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "Stmt123456789123", 
      "Effect": "Allow", 
      "Action": [ 
       "s3:*" 
      ], 
      "Resource": [ 
       "arn:aws:s3:::bucketname" 
      ] 
     } 
    ] 
} 

{ 
    "Version": "2012-10-17", 
    "Id": "Policy1425419737188", 
    "Statement": [ 
     { 
      "Sid": "Stmt123456789123", 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": "s3:*", 
      "Resource": "arn:aws:s3:::bucketname/*" 
     } 
    ] 
} 

これはで生成することができます:AWS Policy Generator

次のようになりますどの
関連する問題