七牛文件批量上傳

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;   //返回的就是已經改變的圖片
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末茧痒,一起剝皮案震驚了整個濱河市肮韧,隨后出現的幾起案子,更是在濱河造成了極大的恐慌旺订,老刑警劉巖弄企,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異区拳,居然都是意外死亡拘领,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門樱调,熙熙樓的掌柜王于貴愁眉苦臉地迎上來约素,“玉大人,你說我怎么就攤上這事笆凌∈チ裕” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵乞而,是天一觀的道長送悔。 經常有香客問我,道長爪模,這世上最難降的妖魔是什么欠啤? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮屋灌,結果婚禮上洁段,老公的妹妹穿的比我還像新娘。我一直安慰自己共郭,他們只是感情好祠丝,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著落塑,像睡著了一般纽疟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上憾赁,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天污朽,我揣著相機與錄音,去河邊找鬼龙考。 笑死蟆肆,一個胖子當著我的面吹牛矾睦,可吹牛的內容都是我干的。 我是一名探鬼主播炎功,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼枚冗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蛇损?” 一聲冷哼從身側響起赁温,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎淤齐,沒想到半個月后股囊,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡更啄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年稚疹,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祭务。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡内狗,死狀恐怖,靈堂內的尸體忽然破棺而出义锥,到底是詐尸還是另有隱情柳沙,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布缨该,位于F島的核電站偎行,受9級特大地震影響,放射性物質發(fā)生泄漏贰拿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一熄云、第九天 我趴在偏房一處隱蔽的房頂上張望膨更。 院中可真熱鬧,春花似錦缴允、人聲如沸荚守。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矗漾。三九已至,卻和暖如春薄料,著一層夾襖步出監(jiān)牢的瞬間敞贡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工摄职, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留誊役,地道東北人获列。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像蛔垢,于是被迫代替她去往敵國和親击孩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內容

  • 前言: 前陣子遇到七牛文件批量上傳的問題鹏漆,嘗試了幾種方案巩梢,現分享一種目前采用的方案——自定義operation。 ...
    wentianen閱讀 801評論 0 7
  • 項目組件化艺玲、平臺化是技術公司的共同目標括蝠,越來越多的技術公司推崇使用pod管理第三方庫以及私有組件,一方面使項目架構...
    swu_luo閱讀 21,771評論 0 39
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,152評論 25 707
  • 看標題大家應該已經知道了,我要說的是感情的事情若治。早上醒來看朋友圈知道了這個軟件慨蓝,就下載下來用它記錄一些文字,現在葛...
    流浪狗在街頭徘徊閱讀 293評論 0 0
  • 近些天公司出了個賊端幼,女職工掛在陽臺上的內衣常不翼而飛礼烈。 資料室的小喬就為此事十分苦惱,她丟了三件‘維多...
    危險份子閱讀 263評論 0 0