2

画像を 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
}

アップロードが開始されますが、しばらくすると失敗します。ログ:

進捗 0.126221

進捗 0.252442

進捗 0.378663

進捗 0.504884

AWSiOSSDKv2 [エラー] AWSURLSessionManager.m line:260 | -[AWSURLSessionManager URLSession:タスク:didCompleteWithError:] | セッション タスクがエラーで失敗しました: エラー 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=応答を解析できません}

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

 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")

アップロードが失敗した理由について、どうにかしてより多くの情報を得ることができますか?

4

1 に答える 1

0

コード -1017 は、サーバーが有効な HTTP 応答で応答していないことを意味します。詳細ログをオンにして、詳細情報を取得します。

    AWSLogger.defaultLogger().logLevel = .Verbose

以下を使用して S3 にアップロードします。

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

次に、IAM の AWS コンソールで、ポリシー ジェネレーターを使用して、S3 バケットのロール ポリシー (Unauth) を作成します。これは次のようになります。

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

最後に、S3 管理コンソールでバケットのアクセス許可にバケット ポリシーを追加する必要があります。

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

これは、 AWS Policy Generatorで生成できます。

于 2016-05-15T14:05:12.193 に答える