NSUrlConnection實現斷點續傳的關鍵是自定義http request的頭部的range域屬性。
Range頭域
Range頭域可以請求實體的一個或者多個子范圍。例如,
表示頭500個字節:bytes=0-499
表示第二個500字節:bytes=500-999
表示最後500個字節:bytes=-500
表示500字節以後的范圍:bytes=500-
第一個和最後一個字節:bytes=0-0,-1
同時指定幾個范圍:bytes=500-600,601-999
但是服務器可以忽略此請求頭,如果無條件GET包含Range請求頭,響應會以狀態碼206(PartialContent)返回而不是以200(OK)。
在ios中使用NSMutableURLRequest來定義頭部域
- NSURL *url1=[NSURL URLWithString:@"下載地址";
- NSMutableURLRequest* request1=[NSMutableURLRequest requestWithURL:url1];
- [request1 setValue:@"bytes=20000-" forHTTPHeaderField:@"Range"];
- [request1 setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
- NSData *returnData1 = [NSURLConnection sendSynchronousRequest:request1 returningResponse:nil error:nil];
- [self writeToFile:returnData1 fileName:@"SOMEPATH"];
-
-
-
-
- -(void)writeToFile:(NSData *)data fileName:(NSString *) fileName
- {
- NSString *filePath=[NSString stringWithFormat:@"%@",fileName];
- if([[NSFileManager defaultManager] fileExistsAtPath:filePath] == NO){
- NSLog(@"file not exist,create it...");
- [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
- }else {
- NSLog(@"file exist!!!");
- }
-
- FILE *file = fopen([fileName UTF8String], [@"ab+" UTF8String]);
-
- if(file != NULL){
- fseek(file, 0, SEEK_END);
- }
- int readSize = [data length];
- fwrite((const void *)[data bytes], readSize, 1, file);
- fclose(file);
- }