【问题标题】:putObject exception. Possibly due to publicReadputObject 异常。可能是由于 publicRead
【发布时间】:2014-04-30 19:51:04
【问题描述】:

在执行putObject 时,我遇到了无法使用 try/catch 捕获的未捕获异常(可能是因为它在不同的线程上运行)。问题是间歇性的,我还没有找到模式。当我将 ACL 设置为 publicRead 时,可能会开始出现此问题。

我使用的是最新的 SDK 版本 1.7.1。

代码如下:

AmazonS3Client *S3 = [[AmazonS3Client alloc] initWithAccessKey:kAWSAccessKey withSecretKey:kAWSSecretKey];
S3.endpoint = [AmazonEndpoints s3Endpoint:US_WEST_2];
S3PutObjectRequest *S3POR = [[S3PutObjectRequest alloc] initWithKey:imageKey inBucket:kS3SignatureBucket];
S3POR.delegate = self;
S3POR.cannedACL = [S3CannedACL publicRead];
S3POR.contentType = @"image/png";
S3POR.data = UIImagePNGRepresentation(imageData);
[S3 putObject:S3POR];

【问题讨论】:

    标签: ios amazon-web-services amazon-s3 amazon


    【解决方案1】:

    我不知道您问题的答案,但您可以尝试使用我的代码:

    AmazonS3Client *s3Client = [ [ AmazonS3Client alloc ] initWithAccessKey:strAccessKey withSecretKey:strSecretKey ];
    s3Client.endpoint = [ AmazonEndpoints s3Endpoint:EU_WEST_1 ];
    s3Client.maxRetries = 1;
    s3Client.timeout = 60;
    
    S3TransferManager *s3TransferManager = [ [ S3TransferManager alloc ] init ];
    s3TransferManager.operationQueue.maxConcurrentOperationCount = 2;
    s3TransferManager.s3 = s3Client;
    
    NSString *keyImage = //... here I generate a key
    
    S3PutObjectRequest *putObjectRequest = [ [ S3PutObjectRequest alloc ] initWithKey:keyImage inBucket:self.s3BucketName ];
    putObjectRequest.contentType = @"image/jpeg";
    putObjectRequest.data = UIImageJPEGRepresentation( image, 0.5f );
    putObjectRequest.cannedACL = [ S3CannedACL publicRead ];
    
    putObjectRequest.delegate = self;
    [ s3TransferManager upload:putObjectRequest ];
    

    在上传完成之前不要忘记保持对 AmazonS3Client 和 S3TransferManager 的强引用!

    【讨论】:

    • 使用S3TransferManager 和我所做的有什么区别?另外,您说要保留AmazonS3ClientS3TransferManager 的强引用,但您的代码似乎没有这样做?
    • @pixelfreak 回复:“使用 S3TransferManager 和我所做的有什么区别?” - 主要区别 - 我的代码有效。如果您愿意 - 您可以查看 S3 框架以检查它是否真的有必要。
    • @pixelfreak 回复:“你的代码似乎没有保留强引用” - 我已经简化了我的代码以使其更具可读性。我的原始代码长了 3 倍。只需创建属性并添加类似self. s3Client = s3Client; self.s3TransferManager = s3TransferManager 的内容。
    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 2018-07-24
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 2011-06-06
    相关资源
    最近更新 更多