圖片、視頻上傳小記

来源:http://www.cnblogs.com/linzhengbo/archive/2017/05/09/6831940.html
-Advertisement-
Play Games

我們開發中常用到圖片上傳,比如頭像上傳之類的,還有類似發佈空間說說時發佈多張圖片等等,我在這裡通過借鑒網路資源,並依賴於七牛雲存儲做了一個圖片上傳的小結。 我首先封裝了一個圖片上傳的工具類,繼承自nsobject,命名為QiniuTool;再多圖上傳時,還需要單張圖片的上傳結果處理,因此,我在這裡有 ...


      我們開發中常用到圖片上傳,比如頭像上傳之類的,還有類似發佈空間說說時發佈多張圖片等等,我在這裡通過借鑒網路資源,並依賴於七牛雲存儲做了一個圖片上傳的小結。

      我首先封裝了一個圖片上傳的工具類,繼承自nsobject,命名為QiniuTool;再多圖上傳時,還需要單張圖片的上傳結果處理,因此,我在這裡有多創建了一個輔助工具類,命名為QiniuUploadHelper;

工具類類方法:

#import <Foundation/Foundation.h>
//上傳 視頻 、n 張圖片
#import <QiniuSDK.h>
#import <UIKit/UIKit.h>

typedef enum {
    type_image,
    type_video
}LoadType;

@interface QiniuTool : NSObject

//獲取七牛上傳token
+ (void)getQiniuUploadToken:(LoadType)type loadUrl:(NSString *)tokenUrl result:(void(^)(NSDictionary *token))success failure:(void(^)())failure;

/**
 上傳視頻

 @param videoPathUrl 視頻的本地URL路徑
 */
//+ (void)uploadVedio:(NSURL *)videoPathUrl success:(void(^)(NSMutableDictionary *result))success failure:(void(^)())failure;


/**
 上傳單張圖片

 @param image 圖片
 @param progress 上傳進度
 @param success 成功回調
 @param failure 失敗回調
 */
+ (void)uploadImage:(UIImage*)image loadUrl:(NSString *)tokenUrl progress:(QNUpProgressHandler)progress success:(void(^)(NSString*url))success failure:(void(^)())failure;

//上傳多張圖片,按隊列依次上傳
+ (void)uploadImages:(NSArray*)imageArray loadUrl:(NSString *)tokenUrl progress:(void(^)(CGFloat))progress success:(void(^)(NSArray*urlArray))success failure:(void(^)())failure;


@end
View Code

實現過程:

#import "QiniuTool.h"
#import "QiniuUploadHelper.h"
#import "EBirdDefine.h"

@implementation QiniuTool

//獲取七牛的token
// 此處的networkrequest是我最封裝的網路請求工具類
+(void)getQiniuUploadToken:(LoadType)type loadUrl:(NSString *)tokenUrl result:(void (^)(NSDictionary *))success failure:(void (^)())failure {
    [NetWorkRequest GET_Verify:BASEURL_(tokenUrl) parameters:nil hiddenLoading:NO success:^(NSInteger errorCode, id responseObject, NSString *errorMsg) {
        if (errorCode == 0 && responseObject) {
            success(responseObject);
        }
    } failure:^(NSError *error) {
        failure();
    }];
}

//上傳單張圖片
+ (void)uploadImage:(UIImage *)image loadUrl:(NSString *)tokenUrl progress:(QNUpProgressHandler)progress success:(void (^)(NSString *))success failure:(void (^)())failure {
    [QiniuTool getQiniuUploadToken:type_image loadUrl:tokenUrl result:^(NSDictionary *token) {

//此處block中的鍵值應根據後臺設置,取出正確的結果

        NSString *tokenStr = [token objectForKey:@"token"];
        NSData*data =UIImageJPEGRepresentation(image,0.01);
        if(!data) {
            if(failure) {
                failure();
            }
            return;
        }
        NSString*fileName = [token objectForKey:@"key"];
        BOOL isHttps = TRUE;
        QNZone * httpsZone = [[QNAutoZone alloc] initWithHttps:isHttps dns:nil];
        QNConfiguration *config = [QNConfiguration build:^(QNConfigurationBuilder *builder) {
            builder.zone = httpsZone;
        }];
        
        QNUploadOption *opt = [[QNUploadOption alloc]initWithMime:nil progressHandler:progress params:nil checkCrc:NO cancellationSignal:nil];
        QNUploadManager *uploadManager = [QNUploadManager sharedInstanceWithConfiguration:config];
        
        [uploadManager putData:data key:fileName token:tokenStr complete:^(QNResponseInfo*info,NSString*key,NSDictionary*resp) {
            
           // 此處的結果應根據後臺設置取出相對應的結果
            
            if(info.statusCode == 200 && [resp count]) {   //QiNiuBaseUrl
                NSString *url;
                if ([tokenUrl isEqualToString:@"/customers/headImageUploadToken"]) {
                    url = [NSString stringWithFormat:@"%@",resp[@"head_image"]];
                }else if ([tokenUrl isEqualToString:@"/repair/imageUploadToken"]) {
                    url = [NSString stringWithFormat:@"%@",resp[@"key"]];
                }
                if(success) {
                    success(url);
                }
            }else{
                if(failure) {
                    failure();
                }
            }
        }option:opt];
    } failure:^{
        failure();
    }];
}

//上傳多張圖片
+ (void)uploadImages:(NSArray *)imageArray loadUrl:(NSString *)tokenUrl progress:(void (^)(CGFloat))progress success:(void (^)(NSArray *urlArray))success failure:(void (^)())failure {
    
    NSMutableArray *array = [[NSMutableArray alloc]init];
//    __block NSMutableString *string = [NSMutableString string];
    
//    __block CGFloat totalProgress =0.0f;
//    
//    __block CGFloat partProgress =1.0f/ [imageArray count];
    
    __block NSUInteger currentIndex =0;
    
    QiniuUploadHelper *uploadHelper = [QiniuUploadHelper shareUploadHelper];
    
    __weak typeof(uploadHelper) weakHelper = uploadHelper;
    
    uploadHelper.singleFailureBlock= ^() {
        failure();
        return;
    };
    
    uploadHelper.singleSuccessBlock= ^(NSString*url) {
        [array addObject:url];
//        if (string.length > 0) {
//            string = [[string stringByAppendingString:@","] mutableCopy];
//            string = [[string stringByAppendingString:url] mutableCopy];
//        }else
//            string = [url mutableCopy];
        
//        totalProgress += partProgress;
//        progress(totalProgress);
        currentIndex++;
        
        if(currentIndex == [imageArray count]) {           //  [array count] == [imageArray count]
            success([array mutableCopy]);                                  // [array copy]
            return;
        }else{
            [QiniuTool uploadImage:imageArray[currentIndex] loadUrl:tokenUrl progress:nil success:weakHelper.singleSuccessBlock failure:weakHelper.singleFailureBlock];
        }
    };
    [QiniuTool uploadImage:imageArray[0] loadUrl:tokenUrl progress:nil success:weakHelper.singleSuccessBlock failure:weakHelper.singleFailureBlock];
}

/**
 已時間給圖片命名
 
 @return pic name
 */
+(NSString *)getCurrentDateString {
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
    
    NSString *dateString = [formatter stringFromDate:[NSDate date]];
    return dateString;
}

/*
+(void)uploadVedio:(NSURL *)videoPathUrl  success:(void (^)(NSMutableDictionary *result))success failure:(void (^)())failure {
    //上傳視頻
    [QiniuTool getQiniuUploadToken:type_video result:^(NSDictionary *token) {
        if ([token count]) {
            NSData *data = [NSData dataWithContentsOfURL:videoPathUrl];
            if (!data) {
                if (failure) {
                    failure();
                }
                return ;
            }
            NSString *tokenStr = [token objectForKey:@"upToken"];
            NSString*fileName = [token objectForKey:@"key"];
            QNUploadOption *opt = [[QNUploadOption alloc]initWithMime:nil progressHandler:nil params:nil checkCrc:NO cancellationSignal:nil];
            
            QNUploadManager *upManager = [[QNUploadManager alloc] init];
            [upManager putData:data key:fileName token:tokenStr complete:^(QNResponseInfo *info, NSString *key, NSDictionary *resp) {
                if(info.statusCode == 200 && resp) {  
                    if(success) {
                        NSMutableDictionary *resultDic = [NSMutableDictionary dictionary];
                        [resultDic setObject:[token objectForKey:@"url"] forKey:@"videoUrl"];
                        
                        UIImage *videoImage = [LMUtil getImage:videoPathUrl];
                        // 上傳視頻縮略圖
                        [self uploadImage:videoImage progress:nil success:^(NSString *url) {
                            if (url) {
                                [resultDic setObject:url forKey:@"videoImg"];
                                success(resultDic);
                            }
                        } failure:^{
                            failure();
                        }];
                    }
                }else{
                    if(failure) {
                        failure();
                    }
                }
            } option:opt];
        }
    } failure:^{
        failure();
    }];
}
*/

@end
View Code

 

輔助工具類類方法:

#import <Foundation/Foundation.h>

@interface QiniuUploadHelper : NSObject

@property(nonatomic, copy)void(^singleSuccessBlock)(NSString *);

@property (nonatomic, copy)void(^singleFailureBlock)();

+(instancetype)shareUploadHelper;

@end
View Code

實現:

#import "QiniuUploadHelper.h"

@implementation QiniuUploadHelper

static id _instance = nil;

+(id)allocWithZone:(struct _NSZone *)zone {
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [super allocWithZone:zone];
    });
    return _instance;
}

+(instancetype)shareUploadHelper {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[self alloc] init];
    });
    return _instance;
}

- (id)copyWithZone:(NSZone*)zone {
    return _instance;
}

@end
View Code

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、代碼 2、效果 ...
  • HTML5進行app開發具有開發快,跨平臺等優點,但是當客戶需要訪問照相機或者調用攝像頭等硬體的時候,H5就會有限制,必須要調用原生方法進行設備訪問。下麵簡要介紹JS和原生方法互相調用的方法: 1 在webview的進行配置,首先支持JS和JS介面訪問: 這裡JSHook是一個Java類: 這裡只是 ...
  • 主要的有: 字體相關:line-height, font-family, font-size, font-style, font-variant, font-weight, font 文本相關: letter-spacing, text-align, text-indent, text-transf ...
  • 開本系列,談談一些有趣的 CSS 題目,題目類型天馬行空,想到什麼說什麼,不僅為了拓寬一下解決問題的思路,更涉及一些容易忽視的 CSS 細節。 解題不考慮相容性,題目天馬行空,想到什麼說什麼,如果解題中有你感覺到生僻的 CSS 屬性,趕緊去補習一下吧。 不斷更新,不斷更新,不斷更新,重要的事情說三遍 ...
  • $("#cbutton1").bind("click",{"id":"111","name":"aaa"},getData); 這一句給 cbutton1 指定了 click 事件的綁定函數為 getData,並且向該函數傳遞了JSON格式參數 {"id":"111", "name":"aaa"}. ...
  • var val = $("select[name='type_irb'] option:selected").val(); ...
  • 轉載請註明——博客園igoslly:http://www.cnblogs.com/igoslly/p/6833544.html 轉載請註明——博客園igoslly:http://www.cnblogs.com/igoslly/p/6833544.html 在實際方法調用中,程式按順序逐句執行,直到“ ...
  • 要點:就是緩存輸入的內容到 本地 下麵就是實現保存 搜索內容到本地 和 清空本地歷史的 方法 activity 下拉彈出layout佈局 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...