也许这不是必需的,但可能会帮助某些人。这是用于上传图像到亚马逊S3的代码。
constant.h
#import <Foundation/Foundation.h>
#define SECRET_KEY @"your secret kry"
#define ACCESS_KEY_ID @"your access id"
#define PICTURE_BUCKET @"桶名称"
#define PICTURE_NAME @"任何文字"
#define CREDENTIALS_ERROR_TITLE @"缺少凭据"
#define CREDENTIALS_ERROR_MESSAGE @"AWS 凭据未正确配置。请查看 README 文件。"
@interface Constant : NSObject
+(NSString *)pictureBucket;
@end
In constant.m
#import "Constant.h"
@implementation Constant
+(NSString *)pictureBucket
{
return [[NSString stringWithFormat:@"%@-%@", 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) {
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
#ifdef DEBUG
[AmazonLogger verboseLogging];
#else
[AmazonLogger turnLoggingOff];
#endif
[AmazonErrorHandler shouldNotThrowExceptions];
if(![ACCESS_KEY_ID isEqualToString:@"CHANGE ME"]
&& self.s3 == nil)
{
self.s3 = [[AmazonS3Client alloc] initWithAccessKey:ACCESS_KEY_ID withSecretKey:SECRET_KEY] ;
self.s3.endpoint = [AmazonEndpoints s3Endpoint:US_WEST_2];
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
message:message
delegate:nil
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
alertView.delegate=self;
[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, ^{
S3ResponseHeaderOverrides *override = [[S3ResponseHeaderOverrides alloc] init];
override.contentType = @"image/jpeg";
S3GetPreSignedURLRequest *gpsur = [[S3GetPreSignedURLRequest alloc] init];
gpsur.key = PICTURE_NAME;
gpsur.bucket = [Constant pictureBucket];
gpsur.expires = [NSDate dateWithTimeIntervalSinceNow:(NSTimeInterval) 3600];
gpsur.responseHeaderOverrides = override;
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
{
}NSLog(@"url is %@",url);
});
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
- (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
{
S3PutObjectRequest *por = [[S3PutObjectRequest alloc] initWithKey:PICTURE_NAME
inBucket:[Constant pictureBucket]];
por.contentType = @"image/jpeg";
por.data = imageData;
por.delegate = self;
[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
{
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
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