iOS 七牛雲上傳並獲取圖片----【客戶端】


       最近做了七牛雲存儲的有關內容,涉及到與后台交互獲取驗證的token,無奈,后台自命清高,不與理會,沒辦法呀,於是自己搞唄。首先呢在在七牛上注冊一個賬號,然后呢添加一個存儲空間這時候空間名是用來識別存儲空間的位置,而地區的選擇則是設置存儲七牛服務器的位置,那么選擇一個公開空間免費試用就可以了~~

 

 

       創建好賬號就是查看官方文檔編寫demo的流程了,順便附帶一個下載地址:http://developer.qiniu.com/code/v7/sdk/objc.html    下載來看了下七牛關於ios開發的demo 使用cocopod 管理的。天啊,最近的項目一直沒用它,擔心更新的問題會不會造成不能使用了。。。。。。果真,由於軟件的ruby 版本過低,更新不了第三方的庫,只好又升級了一下第三方的庫,具體升級方式請參考http://www.cnblogs.com/gfxxbk/p/5536397.html…這樣很快就會更新好,但是呢里面也有涉及到的一部分升級失敗的情況,一般都會有錯誤提示,對應的查找就能解決。我升級的時候是版本號寫的過高了,導致一直找不到對應的類庫,所以升級的時候不必寫太高,2.2.2版本就好順便附帶一些解決方法http://blog.csdn.net/springjustin/article/details/51836968  

        終於一切環境需求都准備好了,那就直接引入唄,這時pod導入之后,因為之前的升級,所以一般不會出現文檔中提到的錯誤,很順利的引入了這個類庫。這時候的關鍵是獲得驗證的token 在官方文檔中這個token 是要從自己的后台服務器獲得的,沒辦法,后台不配合也只能自己動手豐衣足食了。
           首先這個token 是用作驗證使用的,,官方建議使用后台生成后,客戶端再獲取使用。但客戶端也能獨自生成具體生成方法如下:

-(void)createToken {
    
    if (!self.scope.length || !self.accessKey.length || !self.secretKey.length) {
        return;
    }
    
    // 將上傳策略中的scrop和deadline序列化成json格式
    NSMutableDictionary *authInfo = [NSMutableDictionary dictionary];
    [authInfo setObject:self.scope forKey:@"scope"];
    [authInfo
     setObject:[NSNumber numberWithLong:[[NSDate date] timeIntervalSince1970] + self.liveTime * 24 * 3600]
     forKey:@"deadline"];
    
    NSData *jsonData =
    [NSJSONSerialization dataWithJSONObject:authInfo options:NSJSONWritingPrettyPrinted error:nil];
    
    // 對json序列化后的上傳策略進行URL安全的base64編碼
    NSString *encodedString = [self urlSafeBase64Encode:jsonData];
    
    // 用secretKey對編碼后的上傳策略進行HMAC-SHA1加密,並且做安全的base64編碼,得到encoded_signed
    NSString *encodedSignedString = [self HMACSHA1:self.secretKey text:encodedString];
    
    // 將accessKey、encodedSignedString和encodedString拼接,中間用:分開,就是上傳的token
    NSString *token =
    [NSString stringWithFormat:@"%@:%@:%@", self.accessKey, encodedSignedString, encodedString];
    
    self.uploadToken = token;
    
}

    有關函數的調用為:將進行URL安全的base64編碼:

 

- (NSString *)urlSafeBase64Encode:(NSData *)text {
    NSString *base64 =
    [[NSString alloc] initWithData:[QN_GTM_Base64 encodeData:text] encoding:NSUTF8StringEncoding];
    base64 = [base64 stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
    base64 = [base64 stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
    return base64;
}

 

    

 

      對上傳策略中進行HMAC-SHA1加密:

  

- (NSString *)HMACSHA1:(NSString *)key text:(NSString *)text {
    const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
    const char *cData = [text cStringUsingEncoding:NSUTF8StringEncoding];
    
    char cHMAC[CC_SHA1_DIGEST_LENGTH];
    
    CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
    
    NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:CC_SHA1_DIGEST_LENGTH];
    NSString *hash = [self urlSafeBase64Encode:HMAC];
    return hash;
}

 

 

     上面涉及到三個參數,即:Scope、AccessKey、SecretKey,這三個參數是上面我們申請賬號和創建空間的時候得到的,先說第一個參數: Scope : 就是空間的名字,那兩個key就是在個人面板-->個人中心-->秘鑰管理里面能看的到如下所示:

 

       這樣拿到了token 再寫方法就簡單多了,下面是針對上傳圖片做了一個封裝的方法:

    

-(void)uploadImageToQNFilePath:(NSString *)filePath {
    
    QNUploadManager *upManager = [[QNUploadManager alloc] init];
    QNUploadOption *uploadOption = [[QNUploadOption alloc] initWithMime:nil progressHandler:^(NSString *key, float percent) {
        NSLog(@"上傳進度 %.2f", percent);
    }
                                                                 params:nil
                                                               checkCrc:NO
                                                     cancellationSignal:nil];
    [upManager putFile:filePath key:nil token:self.uploadToken complete:^(QNResponseInfo *info, NSString *key, NSDictionary *resp) {
        
        // 發送通知用戶獲取圖片使用
        NSNotification * notice =[NSNotification notificationWithName:@"downLoad" object:nil userInfo:resp];
        [[NSNotificationCenter defaultCenter] postNotification:notice];
        
    }
     
     option:uploadOption];

    
    
}

 

          這樣就可以將圖片上傳上去了 此時我們可以得打兩個返回值 形式如下:

  

   這個時候我們可以拿着這個返回值,拼接我們從七牛雲后台獲取的文件路徑進行拼接使用SDWebImage就可以得到我們上傳的圖片

 

 

      順便說一句,當解析通知傳來的字典時要注意解析的方式是否正確,否則會報錯的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM