我不能,为了我的生活,弄清楚如何在我的iOS项目中实现亚马逊的sdk,我似乎找不到很多关于我想要做什么的文档...这里希望你能提供帮助!
我想非常简单地从我的Amazon S3帐户下载文件并将它们本地存储在iPhone上......我可以通过http地址访问图像来实现,但这并不能像我一样保护图像我更喜欢。
根据我的阅读,我应该做这样的事情:
AmazonS3Client *s3Client = [[AmazonS3Client alloc] initWithAccessKey:@"mykey" withSecretKey:@"mysecretkey"];
S3GetObjectRequest *requestedObject = [[S3GetObjectRequest alloc] initWithKey:bucketPath withBucket:@"mybucket"];
NSLog(@"requestedobject:%@", requestedObject - I get the log here);
S3GetObjectResponse *getObjectResponse = [s3Client getObject:requestedObject];
NSLog(@"requestedobject2:%@", getObjectResponse - it crashes before this happens);
NSData *myData2;
myData2 = getObjectResponse.body;
[myData2 writeToFile:bucketPath atomically:YES];
我显然在使用getObjectResponse,getObject代码时出错了,但我无法弄清楚正确的语法......任何帮助都会受到赞赏!
这是日志: 2012-08-02 17:12:33.856 Collection Master Edition [13176:4e07]要求对象: 2012-08-02 17:12:34.044 Collection Master Edition [13176:4e07] * 由于未捕获的异常'AmazonServiceException'而终止应用程序,原因:'(null)'
也许我还应该提一下我可以使用以下代码获取存储桶列表内容
S3ListObjectsRequest *listObjectRequest = [[S3ListObjectsRequest alloc] initWithName:@"my bucket"];
S3ListObjectsResponse *listObjectResponse = [s3Client listObjects:listObjectRequest];
S3ListObjectsResult *listObjectsResults = listObjectResponse.listObjectsResult;
for (S3ObjectSummary *objectSummary in listObjectsResults.objectSummaries) {
NSLog(@"Bucket Contents:%@" ,[objectSummary key]); // This returns the contents of the bucket
}
谢谢! 扎克
答案 0 :(得分:1)
从我在这里看到的你可能有两个问题之一。首次开始使用AWS时,我遇到了类似的问题。首先确保您的存储桶名称全部为小写字母。你应该检查一下为什么会发生这种情况,方法是在@try - @catch块中记录它并记录错误,这些错误在找出你的问题时提供了很好的细节。
-(UIImage *)getImageFromS3{
@try{
AmazonS3Client *_s3Client = [[AmazonS3Client alloc]initWithAccessKey:ACCESS_KEY withSecretKey:SECRET_KEY];
S3GetObjectRequest *getObjectRequest = [[S3GetObjectRequest alloc]initWithKey:imageKey withBucket:pictureBucket];
S3GetObjectResponse *response = [_s3Client getObject:getObjectRequest];
if (response.error == nil)
{
if (response.body != nil)
{
UIImage *someImage = [UIImage imageWithData:reponse.body];
return someImage;
}
else{
NSLog(@"There was no value in the response body");
return nil;
}
}
else if (response.error != nil)
{
NSLog(@"There was an error in the response while getting image: %@",response.error.description);
}
}
@catch (NSException *exception) {
NSLog(@"There was an exception when connecting to s3: %@",exception.description);
}
}
答案 1 :(得分:0)
问题可能是与密钥对关联的权限。我建议你去你的IAM on your Management Console并创建一个具有你想要的适当S3权限的新组,在这种情况下几乎所有这些权限除了你不需要的一些更多管理事项(所以主要只是POST) ,GET权限)。然后在该组中创建一个用户并使用该密钥对进行测试。这可能会让事情变得清晰,因为这是我认为对我有用的过程。似乎列表权限相当低,但POST和GET需要不同的权限。
答案 2 :(得分:0)
可能是让它,但可能会帮助一些人。以下是在amazone-s3上传图片的代码
constant.h
#import <Foundation/Foundation.h>
#define SECRET_KEY @"your secret kry"
#define ACCESS_KEY_ID @"your access id"
#define PICTURE_BUCKET @&#34;存储桶名称&#34; #define PICTURE_NAME @&#34;任何单词&#34; #define CREDENTIALS_ERROR_TITLE @&#34;缺少证书&#34; #define CREDENTIALS_ERROR_MESSAGE @&#34; AWS Credentials配置不正确。请查看自述文件。&#34;
@interface Constant:NSObject
+(NSString *)pictureBucket;
@end
在constant.m
#import&#34; Constant.h&#34;
@implementation Constant +(NSString *)pictureBucket { return [[NSString stringWithFormat:@&#34;%@ - %@&#34;,PICTURE_BUCKET,ACCESS_KEY_ID] lowercaseString]; }
@end
在UploadViewController.h中
typedef enum {
GrandCentralDispatch,
Delegate,
BackgroundThread
} UploadType;
@interface UploadPhotoViewController : UIViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate,UINavigationControllerDelegate, AmazonServiceRequestDelegate>
{
UploadType _uploadType;
}
@property (strong, nonatomic) IBOutlet UIButton *buttonSelectPhoto;
@property (nonatomic, retain) AmazonS3Client *s3;
在UploadViewController.m
中 #import "UploadPhotoViewController.h"
#import <AWSRuntime/AWSRuntime.h>
#import "Constant.h"
@interface UploadPhotoViewController ()
@end
@implementation UploadPhotoViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
#ifdef DEBUG
[AmazonLogger verboseLogging];
#else
[AmazonLogger turnLoggingOff];
#endif
[AmazonErrorHandler shouldNotThrowExceptions];
if(![ACCESS_KEY_ID isEqualToString:@"CHANGE ME"]
&& self.s3 == nil)
{
// Initial the S3 Client.
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// This sample App is for demonstration purposes only.
// It is not secure to embed your credentials into source code.
// DO NOT EMBED YOUR CREDENTIALS IN PRODUCTION APPS.
// We offer two solutions for getting credentials to your mobile App.
// Please read the following article to learn about Token Vending Machine:
// * http://aws.amazon.com/articles/Mobile/4611615499399490
// Or consider using web identity federation:
// * http://aws.amazon.com/articles/Mobile/4617974389850313
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
self.s3 = [[AmazonS3Client alloc] initWithAccessKey:ACCESS_KEY_ID withSecretKey:SECRET_KEY] ;
self.s3.endpoint = [AmazonEndpoints s3Endpoint:US_WEST_2];
// Create the picture bucket.
S3CreateBucketRequest *createBucketRequest = [[S3CreateBucketRequest alloc] initWithName:[Constant pictureBucket] andRegion:[S3Region USWest2]];
S3CreateBucketResponse *createBucketResponse = [self.s3 createBucket:createBucketRequest];
if(createBucketResponse.error != nil)
{
NSLog(@"Error: %@", createBucketResponse.error);
}
}
}
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if ([ACCESS_KEY_ID isEqualToString:@"CHANGE ME"])
{
[self showAlertMessage:CREDENTIALS_ERROR_MESSAGE withTitle:CREDENTIALS_ERROR_TITLE];
}
} - (void)showAlertMessage:(NSString *)message withTitle:(NSString *)title { UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:title 消息:消息 代表:无 cancelButtonTitle:@&#34;确定&#34; otherButtonTitles:无]; alertView.delegate =自我; [alertView show]; } - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
// Set the content type so that the browser will treat the URL as an image.
S3ResponseHeaderOverrides *override = [[S3ResponseHeaderOverrides alloc] init];
override.contentType = @"image/jpeg";
// Request a pre-signed URL to picture that has been uplaoded.
S3GetPreSignedURLRequest *gpsur = [[S3GetPreSignedURLRequest alloc] init];
gpsur.key = PICTURE_NAME;
gpsur.bucket = [Constant pictureBucket];
gpsur.expires = [NSDate dateWithTimeIntervalSinceNow:(NSTimeInterval) 3600]; // Added an hour's worth of seconds to the current time.
gpsur.responseHeaderOverrides = override;
// Get the URL
NSError *error = nil;
NSURL *url = [self.s3 getPreSignedURL:gpsur error:&error];
if(url == nil)
{
if(error != nil)
{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Error: %@", error);
[self showAlertMessage:[error.userInfo objectForKey:@"message"] withTitle:@"Browser Error"];
});
}
}
else
{
/*dispatch_async(dispatch_get_main_queue(), ^{
// Display the URL in Safari
[[UIApplication sharedApplication] openURL:url];
});*/
}NSLog(@"url is %@",url);
});
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)buttonTakePhoto:(id)sender
{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.allowsEditing = YES;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentViewController:picker animated:YES completion:NULL];
}
- (IBAction)buttonSelectPhoto:(id)sender
{
[self showImagePicker:Delegate];
}
- (void)showImagePicker:(UploadType)uploadType
{
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init] ;
imagePicker.delegate = self;
_uploadType = uploadType;
[self presentViewController:imagePicker animated:YES completion:NULL];
}
- (void)processDelegateUpload:(NSData *)imageData
{
// Upload image data. Remember to set the content type.
S3PutObjectRequest *por = [[S3PutObjectRequest alloc] initWithKey:PICTURE_NAME
inBucket:[Constant pictureBucket]];
por.contentType = @"image/jpeg";
por.data = imageData;
por.delegate = self;
// Put the image data into the specified s3 bucket and object.
[self.s3 putObject:por];
}
-(void)request:(AmazonServiceRequest *)request didCompleteWithResponse:(AmazonServiceResponse *)response
{
[self showAlertMessage:@"The image was successfully uploaded." withTitle:@"Upload Completed"];
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
}
-(void)request:(AmazonServiceRequest *)request didFailWithError:(NSError *)error
{
NSLog(@"Error: %@", error);
[self showAlertMessage:error.description withTitle:@"Upload Error"];
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
}
#pragma mark - UIImagePickerControllerDelegate methods
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
// Get the selected image.
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
// Convert the image to JPEG data.
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
if(_uploadType == Delegate)
{
[self processDelegateUpload:imageData];
}
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
[picker dismissViewControllerAnimated:YES completion:NULL];
}
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[picker dismissViewControllerAnimated:YES completion:NULL];
}
- (IBAction)buttonBack:(id)sender
{
[self.navigationController popViewControllerAnimated:YES];
}
@end