9

由于我们似乎受限于桶的数量,我试图弄清楚如何完成以下工作:

  • 我有一个 iOS 应用程序,用户可以在其中上传个人资料图片。
  • 任何人都可以查看个人资料图片(我希望它公开)。
  • 理想情况下,我可以上传到单个存储桶(例如:myprofilepics.s3.amazonaws.com)
  • 理想情况下,每个用户都可以上传到自己的子文件夹(例如:myprofilepics.s3.amazonaws.com/images/userXXX/
  • 理想情况下,我上传图片,并将其设置为直接从应用程序公开访问,以便其他用户可以立即查看个人资料图片。

我在文档中遗漏了什么吗?感谢您对此问题的任何反馈。

4

3 回答 3

21

为了解决这个问题,我从亚马逊的 iOS SDK 中的示例代码开始,在此处找到。在 SDK zip 中,感兴趣的示例项目可以在samples/S3_Uploader.

要从该示例项目转到上传图片公开的项目,您只需在正确的位置添加一行:

por.cannedACL   = [S3CannedACL publicRead];

用于上传图像por的位置在哪里。S3PutObjectRequest

我的项目上传代码如下所示(看起来几乎与亚马逊的示例代码相同):

NSString *uuid = @""; // Generate a UUID however you like, or use something else to name your image.
UIImage *image; // This is the UIImage you'd like to upload.

// This URL is not used in the example, but it points to the file
// to be uploaded.
NSString *url = [NSString pathWithComponents:@[ @"https://s3.amazonaws.com/", AWS_PICTURE_BUCKET, uuid ]];

// Convert the image to JPEG data. Use UIImagePNGRepresentation for pngs
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);

// Create the S3 Client.
AmazonS3Client *s3 = [[AmazonS3Client alloc] initWithAccessKey:AWS_ACCESS_KEY_ID withSecretKey:AWS_SECRET_KEY];

@try {
    // Create the picture bucket.
    [s3 createBucket:[[S3CreateBucketRequest alloc] initWithName:AWS_PICTURE_BUCKET]];

    // Upload image data.  Remember to set the content type.
    S3PutObjectRequest *por = [[S3PutObjectRequest alloc] initWithKey:uuid inBucket:AWS_PICTURE_BUCKET];
    por.contentType = @"image/jpeg"; // use "image/png" here if you are uploading a png
    por.cannedACL   = [S3CannedACL publicRead];
    por.data        = imageData;
    por.delegate    = self; // Don't need this line if you don't care about hearing a response.

    // Put the image data into the specified s3 bucket and object.
    [s3 putObject:por];
}
@catch (AmazonClientException *exception) {
    NSLog(@"exception");
}

AWS_ACCESS_KEY_IDAWS_SECRET_KEY当然,它们是您的 AWS 凭证,并且是AWS_PICTURE_BUCKET您的图片存储桶。

于 2012-08-13T19:23:30.080 回答
1

如果您要管理自己用户的身份(即不是通过 AIM),您还必须管理有权访问的资源。我会加入一个瘦 Web 服务来管理对 S3 上文件的访问。

或者,您可以使用临时安全凭证和安全策略为您的用户提供对 S3 的访问权限。您必须在设备上添加代码才能为您的用户获取临时令牌。

我会选择第一个解决方案,因为它使 Amazon S3 不在等式中,您可以在稍后阶段腾出双手来选择另一个后端。

于 2012-06-14T21:32:26.813 回答
0

这就是我最终做的事情:

    BOOL success = YES;

// Initialize the S3 Client.
AmazonS3Client *s3 = [[AmazonS3Client alloc] initWithAccessKey:ACCESS_KEY_ID withSecretKey:SECRET_KEY];

@try {
    // Create the picture bucket.
    [s3 createBucket:[[S3CreateBucketRequest alloc] initWithName:HOSTED_BUCKET]];

    NSString *remoteImagePath = [self pathWithImageType:SFHostedImageTypeProfile identiefier:@""];


    // Upload image data.  Remember to set the content type.
    S3PutObjectRequest *por = [[S3PutObjectRequest alloc] initWithKey:remoteImagePath inBucket:HOSTED_BUCKET];
    por.contentType = @"image/png";

    por.data        = UIImagePNGRepresentation(image);

    // Put the image data into the specified s3 bucket and object.
    [s3 putObject:por];
}
@catch (AmazonClientException *exception) {
    //        [Constants showAlertMessage:exception.message withTitle:@"Upload Error"];
    NSLog(@"Save Hosted Image Exception: %@", exception.message);

    success = NO;
}

return success;
于 2012-12-28T21:08:19.413 回答