iOS 使用AFNetWorking下載文件

使用AFNetWorking下載文件時损谦,需要包含AFNetWorking框架(使用的是2.3.0版本)

當只需單個文件下載時蛙吏,可以使用單例模式
.h 文件

#import <AFNetworking.h>

@interface DownLoadOrUpLoadFileManager : NSObject

@property (nonatomic, strong) AFHTTPRequestSerializer *serializer;
@property (nonatomic, strong) AFHTTPRequestOperation *downLoadOperation;

+ (instancetype)getInstance;

#pragma mark -下載文件
/**
 *  根據(jù)url判斷是否已經(jīng)保存到本地了
 *
 *  @param created 文件的創(chuàng)建時間  通過和fileName拼接成完整的文件路徑
 *
 *  @param fileName 文件的名字
 *
 *  @return YES:本地已經(jīng)存在座哩,NO:本地不存在
 */
- (BOOL)isSavedFileToLocalWithCreated:(UInt32)created fileName:(NSString *)fileName;

/**
 *  根據(jù)文件的創(chuàng)建時間 設置保存到本地的路徑
 *
 *  @param created  創(chuàng)建時間
 *  @param fileName 名字
 *
 *  @return <#return value description#>
 */
-(NSString *)setPathOfDocumentsByFileCreated:(UInt32)created fileName:(NSString *)fileName;

/**
 *  根據(jù)文件類型兴革、名字盐欺、創(chuàng)建時間獲得本地文件的路徑螟炫,當文件不存在時波附,返回nil
 *
 *  @param fileType 文件類型
 *  @param fileName 文件名字
 *  @param created  文件在服務器創(chuàng)建的時間
 *
 *  @return
 */
- (NSURL *)getLocalFilePathWithFileType:(HomeWorkFileType)fileType fileName:(NSString *)fileName fileCreated:(UInt32)created;

/**
 *  @brief 下載文件
 *
 *  @param paramDic   額外的參數(shù)
 *  @param requestURL 下載的url
 *  @param fileType   文件類型
 *  @param fileName   文件名字
 *  @param created    文件服務器創(chuàng)建時間
 *  @param success
 *  @param failure
 *  @param progress
 */
- (void)downloadFileWithOption:(NSDictionary *)paramDic
                   withFileUrl:(NSString*)requestURL
                      fileType:(HomeWorkFileType)fileType
                      fileName:(NSString *)fileName
                   fileCreated:(UInt32)created
               downloadSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
               downloadFailure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
                      progress:(void (^)(float progress, long long downloadLength, long long totleLength))progress;

/**
 *  取消下載,并刪除本地已經(jīng)下載了的部分
 *
 *  @param created  文件在服務器創(chuàng)建的時間
 *  @param fileName 文件的名字
 */
- (void)cancleDownLoadFileWithServiceCreated:(UInt32)created fileName:(NSString *)fileName;

/**
 *  正在下載中
 *
 *  @return
 */
- (BOOL)isDownLoadExecuting;

/**
 *  下載暫停
 */
- (void)downLoadPause;

/**
 *  下載繼續(xù)
 */
- (void)downLoadResume;

.m 文件


@implementation DownLoadOrUpLoadFileManager

+ (instancetype)getInstance
{
    static DownLoadOrUpLoadFileManager *manager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[DownLoadOrUpLoadFileManager alloc]init];
        manager.serializer = [AFHTTPRequestSerializer serializer];
    });
    return manager;
}

/**
 *  根據(jù)url判斷是否已經(jīng)保存到本地了
 *
 *  @param url 文件的url
 *
 *  @return YES:本地已經(jīng)存在昼钻,NO:本地不存在
 */
- (BOOL)isSavedFileToLocalWithCreated:(UInt32)created fileName:(NSString *)fileName
{
    // 判斷是否已經(jīng)離線下載了
    NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@/%d/%@", LOCAL_SAVE_PATH, created, fileName]];
    
    NSFileManager *filemanager = [NSFileManager defaultManager];
    
    if ([filemanager fileExistsAtPath:path]) {
        return YES;
    }
    return NO;
}

/**
 *  根據(jù)文件的創(chuàng)建時間 設置保存到本地的路徑
 *
 *  @param created  創(chuàng)建時間
 *  @param fileName 名字
 *
 *  @return <#return value description#>
 */
-(NSString *)setPathOfDocumentsByFileCreated:(UInt32)created fileName:(NSString *)fileName
{
    NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@/%d", LOCAL_SAVE_PATH, created]];
    
    NSFileManager *filemanager = [NSFileManager defaultManager];
    if (![filemanager fileExistsAtPath:path]) {
        [filemanager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
    }
    return path;
}

/**
 *  根據(jù)文件類型掸屡、名字、創(chuàng)建時間獲得本地文件的路徑然评,當文件不存在時仅财,返回nil
 *
 *  @param fileType 文件類型
 *  @param fileName 文件名字
 *  @param created  文件在服務器創(chuàng)建的時間
 *
 *  @return
 */
- (NSURL *)getLocalFilePathWithFileType:(HomeWorkFileType)fileType fileName:(NSString *)fileName fileCreated:(UInt32)created
{
    NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@/%d", LOCAL_SAVE_PATH, created]];
    
    NSFileManager *filemanager = [NSFileManager defaultManager];
    NSArray *fileList = [filemanager subpathsOfDirectoryAtPath:path error:nil];
    
    if ([fileList containsObject:fileName]) {
        NSString *fileUrltemp = [NSString stringWithFormat:@"%@/%@", path, fileName];
        NSURL *url = [NSURL fileURLWithPath:fileUrltemp];
        return url;
    }
    return nil;
}

/**
 *  @brief 下載文件
 *
 *  @param paramDic   額外的參數(shù)
 *  @param requestURL 下載的url
 *  @param fileType   文件類型
 *  @param fileName   文件名字
 *  @param created    文件服務器創(chuàng)建時間
 *  @param success
 *  @param failure
 *  @param progress
 */
- (void)downloadFileWithOption:(NSDictionary *)paramDic
                   withFileUrl:(NSString*)requestURL
                      fileType:(HomeWorkFileType)fileType
                      fileName:(NSString *)fileName
                   fileCreated:(UInt32)created
               downloadSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
               downloadFailure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
                      progress:(void (^)(float progress, long long downloadLength, long long totleLength))progress;
{
    //沙盒路徑    //NSString *savedPath = [NSHomeDirectory() stringByAppendingString:@"/Documents/xxx.zip"];
    
    NSMutableURLRequest *request =[_serializer requestWithMethod:@"POST" URLString:requestURL parameters:paramDic error:nil];
    
    _downLoadOperation = [[AFHTTPRequestOperation alloc]initWithRequest:request];
    
    NSString *localSavePath = [NSString stringWithFormat:@"%@/%@", [self setPathOfDocumentsByFileCreated:created fileName:fileName], fileName];
    
    [_downLoadOperation setOutputStream:[NSOutputStream outputStreamToFileAtPath:localSavePath append:NO]];
    [_downLoadOperation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
        float p = (float)totalBytesRead / totalBytesExpectedToRead;
        if (progress) {
            progress(p, totalBytesRead, totalBytesExpectedToRead);
        }
    }];
    [_downLoadOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        if (success) {
            success(operation,responseObject);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        if (failure) {
            failure(operation,error);
        }
    }];
    
    [_downLoadOperation start];
}
/**
 *  取消下載,并刪除本地已經(jīng)下載了的部分
 *
 *  @param created  文件在服務器創(chuàng)建的時間
 *  @param fileName 文件的名字
 */
- (void)cancleDownLoadFileWithServiceCreated:(UInt32)created fileName:(NSString *)fileName;
{
    [_downLoadOperation cancel];
    
    // 刪除本地文件
    NSString *localSavePath = [NSString stringWithFormat:@"%@/%@", [self setPathOfDocumentsByFileCreated:created fileName:fileName], fileName];
    
    NSFileManager *filemanager = [NSFileManager defaultManager];
    if ([filemanager fileExistsAtPath:localSavePath]) {
        [filemanager removeItemAtPath:localSavePath error:nil];
    }
}

// 正在下載中
- (BOOL)isDownLoadExecuting
{
    return [_downLoadOperation isExecuting];
}
// 下載暫停
- (void)downLoadPause
{
    [_downLoadOperation pause];
}
// 下載繼續(xù)
- (void)downLoadResume
{
    [_downLoadOperation resume];
}

在下載之前可以先判斷一下文件是否已經(jīng)保存到本地
· - (BOOL)isSavedFileToLocalWithCreated:(UInt32)created fileName:(NSString *)fileName碗淌;

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盏求,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子亿眠,更是在濱河造成了極大的恐慌碎罚,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缕探,死亡現(xiàn)場離奇詭異魂莫,居然都是意外死亡,警方通過查閱死者的電腦和手機爹耗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門耙考,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人潭兽,你說我怎么就攤上這事倦始。” “怎么了山卦?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵鞋邑,是天一觀的道長。 經(jīng)常有香客問我,道長枚碗,這世上最難降的妖魔是什么逾一? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮肮雨,結果婚禮上遵堵,老公的妹妹穿的比我還像新娘。我一直安慰自己怨规,他們只是感情好陌宿,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著波丰,像睡著了一般壳坪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掰烟,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天爽蝴,我揣著相機與錄音,去河邊找鬼媚赖。 笑死霜瘪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的惧磺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼捻撑,長吁一口氣:“原來是場噩夢啊……” “哼磨隘!你這毒婦竟也來了?” 一聲冷哼從身側響起顾患,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤番捂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后江解,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體设预,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年犁河,在試婚紗的時候發(fā)現(xiàn)自己被綠了鳖枕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡桨螺,死狀恐怖宾符,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灭翔,我是刑警寧澤魏烫,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響哄褒,放射性物質(zhì)發(fā)生泄漏稀蟋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一呐赡、第九天 我趴在偏房一處隱蔽的房頂上張望退客。 院中可真熱鬧,春花似錦罚舱、人聲如沸井辜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粥脚。三九已至,卻和暖如春包个,著一層夾襖步出監(jiān)牢的瞬間刷允,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工碧囊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留树灶,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓糯而,卻偏偏與公主長得像天通,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子熄驼,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容