七牛云服務器上傳服務

版本記錄

版本號 時間
V1.0 2017.04.20

前言

最近正在做一個項目,要用到七牛的云存儲服務,例如注冊賬號的時候需要上傳注冊者的頭像,這個時候我們主要就是將圖像上傳到七牛服務器,服務器吐給我們一個URL,然后我們將圖片的URL傳給服務器,服務器存儲的就是這個圖片的外接URL地址。
??下面是兩個鏈接:
??七牛官方文檔
??七牛github地址

七牛SDK概覽

這里我就以上傳圖片為例子進行說明七牛服務器上傳服務的原理。至于視頻音頻等的原理都類似。七牛可以從cocoapods上獲取和集成。我們先看一下七牛主要的框架文件。

七牛文檔1
七牛文檔2

這里上傳主要就是采用QNUploadManager這個類。

七牛SDK詳述

SDK環境適配

七牛現在已經更新到7.1版本,他依賴于AFNetworking框架,對ios系統和xcode版本也有要求。需要一定的搭配,具體如下。

|SDK版本|最低ios版本|最低OSX版本|Xcode版本|
|:----:|:----:|:----:|:----:|:---:|
|7.1/AFN-3.x|ios7|OS X10.9|xoode 6|
|7.0/AFN-2.x|ios6|OS X10.8|xoode 5|
|7.x/AFN-1.x|ios5|OS X10.7|xoode 5|
|6.x/AFN-1.x|ios6|None|xoode 5|

我們先看一下上傳文件的實例代碼。

#import <QiniuSDK.h>
...
NSString *token = @"從服務端SDK獲取";
QNUploadManager *upManager = [[QNUploadManager alloc] init];
NSData *data = [@"Hello, World!" dataUsingEncoding : NSUTF8StringEncoding];
[upManager putData:data key:@"hello" token:token
complete: ^(QNResponseInfo *info, NSString *key, NSDictionary *resp) {
NSLog(@"%@", info);
NSLog(@"%@", resp);
} option:nil];
...
//注意:key 及所有需要輸入的字符串必須采用 utf8 編碼,如果使用非 utf8 編碼訪問七牛云存儲將反饋錯誤。

SDK幾個重要參數

1.option參數

關于 option 參數,一般情況下,開發者可以忽略 put 方法中的 option 參數,即在調用時保持 option 的值為 nil 即可。但對于一些特殊的場景,我們可以給 option 傳入一些高級選項以更精確的控制上傳行為和獲取進度信息。option QNUploadOption 類型包含的變量有:params、mimeType、checkCrc、progressHandler、cancelSignal。

2.param參數

用戶自定義參數,必須以 x:開頭,這些參數可以作為變量用于 upToken 的 callbackBody、returnBody、asyncOps 參數中,具體信息請參閱自定義變量。 一個簡單的例子如下:

QNUploadOption *opt = [[QNUploadOption alloc] initWithMime:@"text/plain" progressHandler:nil params:@{ @"x:foo":@"fooval" } checkCrc:YES cancellationSignal:nil];
[upManager putData:data key:@"hello" token:token
complete: ^(QNResponseInfo *info, NSString *key, NSDictionary *resp) {
 NSLog(@"%@", info);
NSLog(@"%@", resp);
} option:opt];

3.mineType參數

為上傳文件設置一個自定義的 MIME 類型,如果為空,那么服務端自動檢測文件的 MIME 類型。

4. checkCrc參數

checkCrc 為 NO 時,服務端不會校驗 crc32 值,checkCrc 為 YES 時,服務端會計算上傳文件的 crc32 值,然后與用戶提供的 crc32 參數值比較確認文件的完整性,如果校驗失敗會返回 406 錯誤。

5. 上傳進度監測和取消上傳

這里利用的就是block來獲得上傳進度和取消上傳。

上傳的block為


typedef void (^QNUpProgressHandler)(NSString *key, float percent);

如果實現了這個 block,并作為 option 參數傳入,會及時得到上傳進度通知。

取消上傳的block為

typedef BOOL (^QNUpCancellationSignal)(void);

如果希望中途可以取消上傳,需要實現上面的 block,并作為參數傳入 option。

6. 斷點續傳

SDK 實現了斷點續上傳,如果需要保存上傳進度,需要您在生成 UploaderManager 實例時傳入一個實現保存進度的代理,SDK 自帶了將進度保存進文件的方法,您可以自己實現其他保存方式。

NSError *error;

QNFileRecorder *file = [QNFileRecorder fileRecorderWithFolder:@"保存目錄" error:&error];

//check error

QNUploadManager *upManager = [[QNUploadManager alloc] initWithRecorder:file];

SDK實際使用

我舉一個例子說明使用七牛的情況吧,在修改個人資料的時候,需要用戶上傳自己的頭像,上傳頭像可以使用七牛的云存儲。具體步驟為:

  • 客戶端和服務端分別集成SDk;
  • 向自己的后臺服務器發送請求,獲取uploadToken;
  • 對接uploadManager類進行上傳,這里有好幾個方法可以使用,需要我們傳遞uploadToken和key,其中key可以自己隨便指定一個字符串,也可以傳nil,傳遞nil則七牛自動為我們生成。

下面我就直接上大體上的代碼了。

1. 打開本地相冊獲取圖像

#pragma mark - UIImagePickerControllerDelegate

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
    [picker dismissViewControllerAnimated:YES completion:nil];
    self.uploadImage = info[UIImagePickerControllerOriginalImage];
    self.infoFillView.avatarImage = self.uploadImage;
    
    [self getTokenFromMyServer];
    
}

2. 請求自己的服務器獲取uploadToken

//從本地服務器請求token
    
- (void)getTokenFromMyServer
{
    NSMutableDictionary *dictParam = [NSMutableDictionary dictionary];
    [dictParam setObject:[JJConfig myProfile].token forKey:@"token"];
    [dictParam setObject:@"1" forKey:@"version"];
    NSString *serverURL = [NSString stringWithFormat:@"%@%@",kDomainURL,kLoginUploadImageToMyServer];
    
    [[JJNetWorkManager manager] requestByGetNetworkWithServerUrl:serverURL parameters:dictParam success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSLog(@"%@",responseObject);
            if ([[responseObject objectForKey:@"code"] integerValue] == 0) {
                NSDictionary *dataDict = [responseObject objectForKey:@"data"];
                self.uploadToken = [dataDict objectForKey:@"uploadToken"];
                self.uploadZone = [dataDict objectForKey:@"zone"];

                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                    [self uploadImageToQiniu];
                });
            }
    } error:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@",error);
    }];

}

//調用網絡工具,我們這次用的是get請求

- (void)requestNetworkWithServerUrl:(NSString * _Nonnull)serverUrl parameters:(nullable id)parameters success:(successRequestBlock)successBlock error:(errorRequestBlock)errorBlock {
    
    self.sessionManager.requestSerializer = [AFJSONRequestSerializer serializer];
    self.sessionManager.responseSerializer = [AFJSONResponseSerializer serializer];
    [self.sessionManager.requestSerializer setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [self.sessionManager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    self.sessionManager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
    self.sessionManager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"];
    [self.sessionManager.requestSerializer setValue:[ZBConfig myProfile].token forHTTPHeaderField:@"token"];
    [self.sessionManager.requestSerializer setValue:@"1" forHTTPHeaderField:@"version"];
    
    [self.sessionManager GET:serverUrl parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
        DDLogVerbose(@"\nRequest URL: %@\nResponse: \n%@",task.currentRequest.URL,responseObject);
        successBlock(task,responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        DDLogError(@"\nRequest URL: %@\nErrorInfo :\n%@ \nError:%@",task.currentRequest.URL,error.localizedDescription,error);
        errorBlock(task,error);
    }];
}

3. 上傳圖片到七牛

//上傳圖片到七牛
    
- (void)uploadImageToQiniu
{
    QNConfiguration *congfiguration = [QNConfiguration build:^(QNConfigurationBuilder *builder) {
        builder.zone = [QNZone zone1];
    }];

    QNUploadManager *uploadManager = [[QNUploadManager alloc] initWithConfiguration:congfiguration];
    NSData *imageData = nil;
    if (UIImagePNGRepresentation(self.uploadImage) == nil) {
        imageData = UIImageJPEGRepresentation(self.uploadImage, 1.0);
    }
    else {
        imageData = UIImagePNGRepresentation(self.uploadImage);
    }

    [uploadManager putData:imageData key:nil token:self.uploadToken complete:^(QNResponseInfo *info, NSString *key, NSDictionary *resp) {
        if (info.ok) {
            NSLog(@"成功");
        }
        else {
            NSLog(@"失敗");
        }
        NSLog(@"info---%@",info);
        NSLog(@"key---%@",key);
        NSLog(@"resp---%@",resp);

    } option:nil];
    
}

4. 看結果


2017-04-21 20:37:01.229916 ------[3346:678850] 成功
2017-04-21 20:37:01.230149 ------3346:678850] info---<QNResponseInfo= id: F967882A-963F-4E66-91BB-2F643B386F96, ver: 7.1.5, status: 200, requestId: fGgAAMnGNhHiabcU, xlog: body:16;s.ph;s.put.tw;s.put.tr:17;s.put.tw;s.put.tr:18;s.ph;s.put.tw;s.put.tr:19;s.ph;PFDS:20;PFDS:20;PFDS:21;rs9_4.sel/not found;rdb.g/no such key;DBD/404;v4.get/Document not found;rs9_4.ins;rwro.ins:1;mc.s;RS:1;rs.put:2;rs-upload.putFile:26;UP:45, xvia: (null), host: upload-z1.qiniu.com ip: 111.206.234.140 duration: 1.298980 s time: 1492778221 error: (null)>
2017-04-21 20:37:01.230222 ------[3346:678850] key---(null)
2017-04-21 20:37:01.230333 ------[3346:678850] resp---{
    hash = "FgG8rxrG-vftWFCsE-Ru04QW1j7u";
    key = "FgG8rxrG-vftWFCsE-Ru04QW1j7u";
}

然后我們登錄七牛云空間查看結果

七牛云空間結果

我存儲了好幾個都成功了。

后記

七牛簡單的上傳任務并不難,用戶還可以自定義配置上傳,比如選擇上傳的服務器,華北華南等。還有設置是否需要返回上傳進度和取消上傳,斷點續傳等。這需要大家在業務中慢慢的對接。謝謝大家對我的支持。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容

  • 點擊查看原文 Web SDK 開發手冊 SDK 概述 網易云信 SDK 為 Web 應用提供一個完善的 IM 系統...
    layjoy閱讀 13,854評論 0 15
  • 上傳文件是我們在前端開發中經常遇到的一個問題。最近在做某項目管理后臺的時候,需要將輪播圖上傳至七牛云。以前在Vue...
    iliuqiang閱讀 6,234評論 12 16
  • 數據問題 Q:使用Tunnel Java SDK上傳數據,上傳數據可以自動分配到各個分區嗎? A:目前Tunnel...
    許此一生閱讀 2,505評論 0 0
  • 最近做項目用到了七牛云存儲,就講一下如何使用springMVC對視頻上傳到七牛云上。 Java SDK依賴的第三方...
    遠向閱讀 4,475評論 1 3
  • 首先作為一名曾經的英語老師,我要為思維導圖在英語學習以及英語教學中的應用種草。思維導圖會幫助英語學習變得輕松快樂。...
    Cynthia叢閱讀 381評論 0 0