QiNiu.png
七牛文件上傳的過程蜓堕,如下圖所示
QiNiu-Progress.png
如果你不是很熟悉七牛SDK的集成過程裆赵,這里給您一點提示: cocoaPods podfile pod 'Qiniu' 引入七牛SDK文件.
過程如下:@1 獲取上傳文件到七牛的token采记,即用戶權限劣坊。
@2 引用七牛SDK中文件方法,上傳文件矫夯,上傳成功和失敗皆是有回調數據的名扛。
QNUploadOption *opt = [[QNUploadOption alloc] initWithMime:nil progressHandler:progress params:nil checkCrc:NO cancellationSignal:nil];
QNUploadManager *uploadManager = [[QNUploadManager alloc]initWithRecorder:nil];
[uploadManager putData:data key:nil token:token complete:^(QNResponseInfo *info, NSString *key, NSDictionary *resp) {
if (info.statusCode == 200 && resp) {
NSString *url;
url = [NSString stringWithFormat:@"%@%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"token"], resp[@"key"]];
if (success) {
success(url);
}
} else {
if (failure) {
failure();
}
}
} option:opt];
下邊給出批量上傳的方法:
該類用于接收成功和失敗的回調
#import <Foundation/Foundation.h>
@interface QiNiuUploadHelper : NSObject
/**
* 成功回調
*/
@property (copy, nonatomic) void (^singleSuccessBlock)(NSString *);
/**
* 失敗回調
*/
@property (copy, nonatomic) void (^singleFailureBlock)();
+ (instancetype)sharedInstance;
@end
.m實現方式
#import "QiNiuUploadHelper.h"
static QiNiuUploadHelper *_sharedInstance ;
@implementation QiNiuUploadHelper
+ (instancetype)sharedInstance {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[QiNiuUploadHelper alloc] init];
});
return _sharedInstance;
}
-(id)copyWithZone:(NSZone *)zone{
return _sharedInstance;
}
+(id)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [super allocWithZone:zone];
});
return _sharedInstance;
}
@end
批量上傳的具體調用方法API
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "QiniuSDK.h"
@interface QiNiuSystemService : NSObject
/**
* 上傳圖片
*
* @param image 需要上傳的image
* @param progress 上傳進度block
* @param success 成功block 返回url地址
* @param failure 失敗block
*/
+ (void)uploadImage:(UIImage *)image
progress:(QNUpProgressHandler)progress
success:(void (^)(NSString *url))success
failure:(void (^)())failure;
/**
* 上傳多張圖片,按隊列依次上傳
*
* @param imageArray 存放image的數字
* @param progress 上傳到七牛的進度
* @param success 成功block 返回key
* @param failure 失敗block
*/
+ (void)uploadImages:(NSArray *)imageArray
progress:(void (^)(CGFloat))progress
success:(void (^)(NSArray *))success
failure:(void (^)())failure;
/**
* 獲取七牛上傳token
*
* @param success 成功block 返回token
* @param failure 失敗block
*/
+ (void)qiNiuUploadToken:(void (^)(NSString *token))success failure:(void (^)())failure;
/**
* 獲取七牛上傳成功的key
*
* @param key 上傳成功之后返回圖片對應的key
* @param success 成功block 返回url地址
* @param failure 失敗block
*/
+ (void)qiNiuUrlkey:(NSString *)key success:(void (^)(NSString *url))success failure:(void (^)())failure;
/**
* 獲取七牛上傳成功的成功后服務端返回的url
*
* @param keyArray 上傳成功之后返回圖片對應的key數組
* @param success 成功block 返回url地址數組
* @param failure 失敗block
*/
+ (void)qiNiuUrlKeyArray:(NSArray *)keyArray success:(void (^)(NSArray *array))success failure:(void (^)())failure;
/**
* 將圖片壓縮為需要的比例
*
* @param image 需要處理的圖片
* @param size 圖片返回大小
*
* @return image
*/
+(UIImage*)originImage:(UIImage *)image scaleToSize:(CGSize)size;
@end
具體的.m實現:
#import "QiNiuSystemService.h"
#import "QiNiuUploadHelper.h"
#import "HotelRequest.h"
#import "QiniuSDK.h"
@implementation QiNiuSystemService
+ (void)uploadImage:(UIImage *)image progress:(QNUpProgressHandler)progress success:(void (^)(NSString *url))success failure:(void (^)())failure{
[QiNiuSystemService getQiniuUploadToken:^(NSString *token) {
UIImage *sizedImage = [QiNiuSystemService OriginImage:image scaleToSize:CGSizeMake(1000, 1000) ];
NSData *data = UIImageJPEGRepresentation(sizedImage, 0.3);
if (!data) {
if (failure) {
failure();
}
return;
}
QNUploadOption *opt = [[QNUploadOption alloc] initWithMime:nil progressHandler:progress params:nil checkCrc:NO cancellationSignal:nil];
QNUploadManager *uploadManager = [[QNUploadManager alloc]initWithRecorder:nil];
[uploadManager putData:data key:nil token:token complete:^(QNResponseInfo *info, NSString *key, NSDictionary *resp) {
if (info.statusCode == 200 && resp) {
NSString *url;
url = [NSString stringWithFormat:@"%@%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"token"], resp[@"key"]];
if (success) {
success(url);
}
}
else {
if (failure) {
failure();
}
}
} option:opt];
} failure:^{
if (failure) {
failure();
}
}];
}
//上傳圖片
+ (void)uploadImages:(NSArray *)imageArray progress:(void (^)(CGFloat))progress success:(void (^)(NSArray *))success failure:(void (^)())failure{
NSMutableArray *array = [[NSMutableArray alloc] init];
__block float totalProgress = 0.0f;
__block float partProgress = 1.0f / [imageArray count];
__block NSUInteger currentIndex = 0;
QiNiuUploadHelper *uploadHelper = [QiNiuUploadHelper sharedInstance];
__weak typeof(uploadHelper) weakHelper = uploadHelper;
uploadHelper.singleFailureBlock = ^() {
failure();
return;
};
uploadHelper.singleSuccessBlock = ^(NSString *url) {
[array addObject:url];
totalProgress += partProgress;
progress(totalProgress);
currentIndex++;
if ([array count] == [imageArray count]) {
success([array copy]);
return;
}
else {
[QiNiuSystemService uploadImage:imageArray[currentIndex] progress:nil success:weakHelper.singleSuccessBlock failure:weakHelper.singleFailureBlock];
}
};
[QiNiuSystemService uploadImage:imageArray[0] progress:nil success:weakHelper.singleSuccessBlock failure:weakHelper.singleFailureBlock];
}
//獲取七牛的token
+ (void)qiNiuUploadToken:(void (^)(NSString *))success failure:(void (^)())failure{
[HotelRequest requestHotelPicwindinfoManager:[HttpRequest requestOperationManager]
success:^(id responseObject) {
NSString * token = [NSString stringWithFormat:@"%@",responseObject[@"picwindinfo"]];
if (success) {
success(token);
}
} failure:^(NSOperation *operation, NSError *error) {
if (failure) {
failure();
}
}];
}
// 獲取七牛上傳成功的key
+ (void)qiNiuUrlkey:(NSString *)key success:(void (^)(NSString *url))success failure:(void (^)())failure{
[HotelRequest requestHotelSubjectPicPathChangeWithPicpath:key
manager:[HttpRequest requestOperationManager]
success:^(id responseObject) {
NSString *picUrl = responseObject[@"picurl"];
if (success) {
success(picUrl);
}
} failure:^(NSOperation *operation, NSError *error) {
if (failure) {
failure();
}
}];
}
// 獲取七牛上傳成功的成功后服務端返回的url
+ (void)qiNiuUrlKeyArray:(NSArray *)keyArray success:(void (^)(NSArray *array))success failure:(void (^)())failure{
NSMutableArray *UrlArray = [[NSMutableArray alloc] init];
__block NSUInteger currentIndex = 0;
QiNiuUploadHelper *uploadHelper = [QiNiuUploadHelper sharedInstance];
__weak typeof(uploadHelper) weakHelper = uploadHelper;
uploadHelper.singleFailureBlock = ^() {
failure();
return;
};
uploadHelper.singleSuccessBlock = ^(NSString *url) {
[UrlArray addObject:url];
currentIndex++;
if ([UrlArray count] == [keyArray count]) {
success([UrlArray copy]);
return;
}
else {
[QiNiuSystemService getQiniuUrlkey:url success:weakHelper.singleSuccessBlock failure:weakHelper.singleFailureBlock];
}
};
[QiNiuSystemService getQiniuUrlkey:keyArray[0] success:weakHelper.singleSuccessBlock failure:weakHelper.singleFailureBlock];
}
//壓縮上傳圖片的大小比例
+ (UIImage*)originImage:(UIImage *)image scaleToSize:(CGSize)size{
UIGraphicsBeginImageContext(size); //size 為CGSize類型,即你所需要的圖片尺寸
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return scaledImage; //返回的就是已經改變的圖片
}