Example/AliyunOSSSDK-iOS-Example/Classes/ViewController.m (293 lines of code) (raw):
//
// ViewController.m
// OssIOSDemo
//
// Created by jingdan on 17/11/23.
// Copyright © 2015年 Ali. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "ViewController.h"
#import <AliyunOSSiOS/OSSService.h>
#import "OSSTestMacros.h"
#import "DownloadService.h"
#import "OSSWrapper.h"
@interface ViewController ()
{
NSString * uploadFilePath;
int originConstraintValue;
}
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *inputViewBottom;
@property (weak, nonatomic) IBOutlet UIImageView *ossImageView;
@property (weak, nonatomic) IBOutlet UITextField *ossTextFileName;
@property (weak, nonatomic) IBOutlet UITextField *ossTextWidth;
@property (weak, nonatomic) IBOutlet UITextField *ossTextHeight;
@property (weak, nonatomic) IBOutlet UITextField *ossTextWaterMark;
@property (weak, nonatomic) IBOutlet UITextField *ossTextSize;
@property (weak, nonatomic) IBOutlet UIButton *ossButtonSelectPic;
@property (weak, nonatomic) IBOutlet UIButton *ossButtonCancel;
@property (weak, nonatomic) IBOutlet UIButton *ossButtonNormalPut;
@property (weak, nonatomic) IBOutlet UIButton *ossButtonNormalGet;
@property (weak, nonatomic) IBOutlet UIButton *ossButtonNormalCancel;
@property (weak, nonatomic) IBOutlet UIButton *ossButtonResize;
@property (weak, nonatomic) IBOutlet UIButton *ossButtonWatermark;
- (IBAction)onOssButtonSelectPic:(UIButton *)sender;
- (IBAction)onOssButtonCancel:(UIButton *)sender;
- (IBAction)onOssButtonNormalPut:(UIButton *)sender;
- (IBAction)onOssButtonNormalGet:(UIButton *)sender;
- (IBAction)onOssButtonNormalCancel:(UIButton *)sender;
- (IBAction)onOssButtonResize:(UIButton *)sender;
- (IBAction)onOssButtonWatermark:(UIButton *)sender;
@property (weak, nonatomic) IBOutlet UILabel *progressLab;
@property (weak, nonatomic) IBOutlet UIProgressView *progressBar;
@property (weak, nonatomic) IBOutlet UIButton *downloadButton;
@property (weak, nonatomic) IBOutlet UIButton *uploadBigFileButton;
@property (nonatomic, strong) DownloadRequest *downloadRequest;
@property (nonatomic, strong) OSSClient *mClient;
@property (nonatomic, copy) Checkpoint *checkpoint;
@property (nonatomic, copy) NSString *downloadURLString;
@property (nonatomic, copy) NSString *headURLString;
@property (nonatomic, strong) DownloadService *downloadService;
@property (nonatomic, strong) OSSWrapper *oss;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[OSSLog enableLog]; // 开启sdk的日志功能
[_uploadBigFileButton addTarget:self action:@selector(uploadBigFileClicked:) forControlEvents:UIControlEventTouchUpInside];
[self setupOSS];
[self initDownloadURLs];
self.progressBar.progress = 0;
}
- (void)setupOSS {
_oss = [[OSSWrapper alloc] init];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)textFieldDidBeginEditing:(UITextField *)textField {
originConstraintValue = self.inputViewBottom.constant;
self.inputViewBottom.constant -= 85;
[UIView animateWithDuration:1 animations:^{
[self.view layoutIfNeeded];
}];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
-(void)textFieldDidEndEditing:(UITextField *)textField
{
self.inputViewBottom.constant = originConstraintValue;
}
- (void)saveImage:(UIImage *)currentImage withName:(NSString *)imageName {
NSData *imageData = UIImageJPEGRepresentation(currentImage, 0.5);
NSString *fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:imageName];
[imageData writeToFile:fullPath atomically:NO];
uploadFilePath = fullPath;
NSLog(@"uploadFilePath : %@", uploadFilePath);
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[picker dismissViewControllerAnimated:YES completion:^{}];
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
NSLog(@"image width:%f, height:%f", image.size.width, image.size.height);
[self saveImage:image withName:@"currentImage"];
[self.ossImageView setImage:image];
self.ossImageView.tag = 100;
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[self dismissViewControllerAnimated:YES completion:^{}];
}
- (BOOL)verifyFileName {
if (_ossTextFileName.text == nil || [_ossTextFileName.text length] == 0) {
[self showMessage:@"error" inputMessage:@"The file name cannot be empty!"];
return NO;
}
return YES;
}
- (IBAction)onOssButtonSelectPic:(UIButton *)sender {
NSString * title = @"select";
NSString * cancelButtonTitle = @"cancel";
NSString * picButtonTitle = @"take pictures";
NSString * photoButtonTitle = @"select from the album";
UIAlertController * alert = [UIAlertController alertControllerWithTitle:title message:nil preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction * cancelAction = [UIAlertAction actionWithTitle:cancelButtonTitle style:UIAlertActionStyleCancel handler:nil];
UIAlertAction * picAction = [UIAlertAction actionWithTitle:picButtonTitle style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.delegate = self;
imagePickerController.allowsEditing = YES;
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentViewController:imagePickerController animated:YES completion:^{}];
}];
UIAlertAction * photoAction = [UIAlertAction actionWithTitle:photoButtonTitle style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.delegate = self;
imagePickerController.allowsEditing = YES;
imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:imagePickerController animated:YES completion:^{}];
}];
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
[alert addAction:cancelAction];
[alert addAction:picAction];
[alert addAction:photoAction];
} else {
[alert addAction:cancelAction];
[alert addAction:photoAction];
}
[self presentViewController:alert animated:YES completion:nil];
}
// 取消上传
- (IBAction)onOssButtonCancel:(UIButton *)sender {
_ossTextFileName.text = @"";
uploadFilePath = @"";
[_ossImageView setImage:nil];
}
// 普通上传
- (IBAction)onOssButtonNormalPut:(UIButton *)sender {
if (![self verifyFileName]) {
return;
}
NSString *funcStr = @"upload";
NSString * objectKey = _ossTextFileName.text;
[self.oss asyncPutImage:objectKey localFilePath:uploadFilePath success:^(id result) {
[self showMessage:funcStr inputMessage:@"success"];
} failure:^(NSError *error) {
[self showMessage:funcStr inputMessage:error.localizedDescription];
}];
}
// 普通下载
- (IBAction)onOssButtonNormalGet:(UIButton *)sender {
if (![self verifyFileName]) {
return;
}
NSString *funcStr = @"download";
NSString * objectKey = _ossTextFileName.text;
[self.oss asyncGetImage:objectKey success:^(id result) {
[self showMessage:funcStr inputMessage:@"success"];
} failure:^(NSError *error) {
[self showMessage:funcStr inputMessage:error.localizedDescription];
}];
}
// 取消普通上传/下载任务
- (IBAction)onOssButtonNormalCancel:(UIButton *)sender {
if (![self verifyFileName]) {
return;
}
[self.oss normalRequestCancel];
}
// 图片缩放
- (IBAction)onOssButtonResize:(UIButton *)sender {
if (![self verifyFileName]) {
return;
}
NSString * objectKey = _ossTextFileName.text;
int width = [_ossTextWidth.text intValue];
int height = [_ossTextHeight.text intValue];
NSString *funcStr = @"picture zoom";
[self.oss reSize:objectKey picWidth:width picHeight:height success:^(id result) {
[self showMessage:funcStr inputMessage:@"success!"];
NSString *filePath = (NSString *)result;
self.ossImageView.image = [[UIImage alloc] initWithContentsOfFile:filePath];
} failure:^(NSError *error) {
[self showMessage:funcStr inputMessage:error.localizedDescription];
}];
}
// 图片水印
- (IBAction)onOssButtonWatermark:(UIButton *)sender {
if (![self verifyFileName]) {
return;
}
NSString * objectKey = _ossTextFileName.text;
NSString * waterMark = _ossTextWaterMark.text;
int size = [_ossTextSize.text intValue];
NSString *funcStr = @"image watermark";
[self.oss textWaterMark:objectKey waterText:waterMark objectSize:size success:^(id result) {
[self showMessage:funcStr inputMessage:@"success!"];
NSString *filePath = (NSString *)result;
self.ossImageView.image = [[UIImage alloc] initWithContentsOfFile:filePath];
} failure:^(NSError *error) {
[self showMessage:funcStr inputMessage:error.localizedDescription];
}];
}
/**
* @brief 下载后存储并显示图片
*
* @param objectData 图片数据
* @param objectKey 文件名设置为objectKey
*/
- (void)saveAndDisplayImage:(NSData *)objectData
downloadObjectKey:(NSString *)objectKey
{
NSString *fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:objectKey];
[objectData writeToFile:fullPath atomically:NO];
UIImage * image = [[UIImage alloc] initWithData:objectData];
uploadFilePath = fullPath;
[self.ossImageView setImage:image];
}
- (void)showMessage:(NSString *)putType
inputMessage:(NSString*)message {
UIAlertAction * defaultAction = [UIAlertAction actionWithTitle:@"ok" style:UIAlertActionStyleDefault handler:nil];
UIAlertController * alert = [UIAlertController alertControllerWithTitle:putType message:message preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:defaultAction];
[self presentViewController:alert animated:YES completion:nil];
}
- (IBAction)customSignButtonClicked:(id)sender{
OSSCustomSignerCredentialProvider *provider = [[OSSCustomSignerCredentialProvider alloc] initWithImplementedSigner:^NSString *(NSString *contentToSign, NSError *__autoreleasing *error) {
// 用户应该在此处将需要签名的字符串发送到自己的业务服务器(AK和SK都在业务服务器保存中,从业务服务器获取签名后的字符串)
OSSFederationToken *token = [OSSFederationToken new];
token.tAccessKey = OSS_ACCESSKEY_ID;
token.tSecretKey = OSS_SECRETKEY_ID;
NSString *signedContent = [OSSUtil sign:contentToSign withToken:token];
return signedContent;
}];
NSError *error;
OSSLogDebug(@"%@",[provider sign:@"abc" error:&error]);
}
- (IBAction)triggerCallbackClicked:(id)sender {
NSString *funcStr = @"upload callbacl";
[self.oss triggerCallbackWithObjectKey:_ossTextFileName.text success:^(id result) {
[self showMessage:funcStr inputMessage:@"success"];
} failure:^(NSError *error) {
[self showMessage:funcStr inputMessage:error.localizedDescription];
}];
}
- (void)uploadBigFileClicked:(id)sender {
NSString *funcStr = @"large file upload";
[self.oss multipartUploadWithSuccess:^(id result) {
[self showMessage:funcStr inputMessage:@"success"];
} failure:^(NSError *error) {
[self showMessage:funcStr inputMessage:error.localizedDescription];
}];
}
- (void)initDownloadURLs {
OSSPlainTextAKSKPairCredentialProvider *pCredential = [[OSSPlainTextAKSKPairCredentialProvider alloc] initWithPlainTextAccessKey:OSS_ACCESSKEY_ID secretKey:OSS_SECRETKEY_ID];
_mClient = [[OSSClient alloc] initWithEndpoint:OSS_ENDPOINT credentialProvider:pCredential];
OSSTask *downloadURLTask = [_mClient presignConstrainURLWithBucketName:@"aliyun-dhc-shanghai" withObjectKey:OSS_DOWNLOAD_FILE_NAME withExpirationInterval:1800];
_downloadURLString = downloadURLTask.result;
OSSTask *headURLTask = [_mClient presignConstrainURLWithBucketName:@"aliyun-dhc-shanghai" withObjectKey:OSS_DOWNLOAD_FILE_NAME httpMethod:@"HEAD" withExpirationInterval:1800 withParameters:nil];
_headURLString = headURLTask.result;
}
- (IBAction)resumeDownloadClicked:(id)sender {
_downloadRequest = [DownloadRequest new];
_downloadRequest.sourceURLString = _downloadURLString; // 设置资源的url
_downloadRequest.headURLString = _headURLString;
NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
_downloadRequest.downloadFilePath = [documentPath stringByAppendingPathComponent:OSS_DOWNLOAD_FILE_NAME]; //设置下载文件的本地保存路径
__weak typeof(self) wSelf = self;
_downloadRequest.downloadProgress = ^(int64_t bytesReceived, int64_t totalBytesReceived, int64_t totalBytesExpectToReceived) {
// totalBytesReceived是当前客户端已经缓存了的字节数,totalBytesExpectToReceived是总共需要下载的字节数。
dispatch_async(dispatch_get_main_queue(), ^{
__strong typeof(self) sSelf = wSelf;
CGFloat fProgress = totalBytesReceived * 1.f / totalBytesExpectToReceived;
sSelf.progressLab.text = [NSString stringWithFormat:@"%.2f%%", fProgress * 100];
sSelf.progressBar.progress = fProgress;
});
};
_downloadRequest.failure = ^(NSError *error) {
__strong typeof(self) sSelf = wSelf;
sSelf.checkpoint = error.userInfo[@"checkpoint"];
};
_downloadRequest.success = ^(NSDictionary *result) {
NSLog(@"download successful");
};
_downloadRequest.checkpoint = self.checkpoint;
NSString *titleText = [[_downloadButton titleLabel] text];
if ([titleText isEqualToString:@"download"]) {
[_downloadButton setTitle:@"pause" forState: UIControlStateNormal];
_downloadService = [DownloadService downloadServiceWithRequest:_downloadRequest];
[_downloadService resume];
} else {
[_downloadButton setTitle:@"download" forState: UIControlStateNormal];
[_downloadService pause];
}
}
- (IBAction)cancelDownloadClicked:(id)sender {
[_downloadButton setTitle:@"download" forState: UIControlStateNormal];
[_downloadService cancel];
}
@end