2011-12-04 14 views
49

मैं AFNetworking लाइब्रेरी का उपयोग कर रहा हूं। मैं यह नहीं समझ सकता कि फ़ाइल कैसे डाउनलोड करें और इसे दस्तावेज़ निर्देशिका में कैसे सहेज लें।फ़ाइल डाउनलोड करने और AFNetworking के साथ दस्तावेज़ निर्देशिका में सहेजने के लिए कैसे?

उत्तर

138
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"..."]]; 
AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease]; 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"filename"]; 
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO]; 

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"Successfully downloaded file to %@", path); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 

[operation start]; 
+10

तुम भी एक प्रगति ब्लॉक जोड़ सकते हैं प्रगति = कुल बाइट्स लिखित/(फ्लोट) कुल बाइट्सएक्सेटेड टू रीड; एनएसएलओजी (@ "डाउनलोड प्रतिशत:% एफ %%", प्रगति * 100); }]; – Climbatize

+19

सावधान रहें कि उपरोक्त कोड सर्वर से आउटपुट स्ट्रीम में कोई प्रतिक्रिया डाउनलोड करेगा, इसलिए यदि सर्वर स्टेटस कोड 404 के साथ प्रतिक्रिया करता है, तो 404 पेज निर्दिष्ट पथ पर सहेजा जाएगा। आपको ऑपरेशन.response.statusCode के लिए सफलता ब्लॉक पर जांच करनी होगी। – leolobato

+0

यह आईओएस 6 पर मेरे लिए काम किया। धन्यवाद @mattt –

31

मैं @ mattt के जवाब उछाल और AFNetworking 2.0 के लिए एक संस्करण पोस्ट AFHTTPRequestOperationManager का उपयोग कर रहा हूँ।

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"filename"]; 

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
AFHTTPRequestOperation *op = [manager GET:@"http://example.com/file/to/download" 
           parameters:nil 
    success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"successful download to %@", path); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 
    }]; 
op.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO]; 
+1

मैं निश्चित रूप से नई एएफनेटवर्किंग लाइब्रेरी – Thomas

+2

@swilliams [AFHTTPRequestOperationManager प्रबंधक] के साथ ऐसा करने की अनुशंसा करता हूं डिफ़ॉल्ट AFJSONResponseSerializer का उपयोग करके नया प्रबंधक ऑब्जेक्ट बनाएगा, क्या आप चाहते हैं? मुझे लगता है कि फ़ाइल को छूने के लिए AFNoneResponseSerialize बनाने के लिए बेहतर है – onmyway133

+0

मैं इसमें डाउनलोड प्रगति पैरामीटर कैसे प्राप्त कर सकता हूं? – shshnk

5

मैं बात कर रहा हूँ के बारे में AFNetworking 2,0

[AFHTTPRequestOperationManager manager] डिफ़ॉल्ट AFJSONResponseSerializer साथ प्रबंधक वस्तु बनाता है, और यह सामग्री प्रकार प्रतिबंध प्रदर्शन करती है। इस

- (BOOL)validateResponse:(NSHTTPURLResponse *)response 
        data:(NSData *)data 
        error:(NSError * __autoreleasing *)error 

पर एक नजर डालें तो हम एक कोई भी प्रतिक्रिया serializer बना सकते हैं और सामान्य रूप में AFHTTPRequestOperationManager उपयोग करने के लिए की जरूरत है।

यहाँ AFNoneResponseSerializer है

@interface AFNoneResponseSerializer : AFHTTPResponseSerializer 

+ (instancetype)serializer; 

@end 

@implementation AFNoneResponseSerializer 

#pragma mark - Initialization 
+ (instancetype)serializer 
{ 
    return [[self alloc] init]; 
} 

- (instancetype)init 
{ 
    self = [super init]; 

    return self; 
} 

#pragma mark - AFURLResponseSerializer 
- (id)responseObjectForResponse:(NSURLResponse *)response 
          data:(NSData *)data 
          error:(NSError *__autoreleasing *)error 

{ 
    return data; 
} 

@end 

प्रयोग

self.manager = [AFHTTPRequestOperationManager manager]; 
self.manager.responseSerializer = [AFNoneResponseSerializer serializer]; 

[self.manager GET:@"https://sites.google.com/site/iphonesdktutorials/xml/Books.xml" 
      parameters:parameters 
       success:^(AFHTTPRequestOperation *operation, id responseObject) 
    { 
     if (success) { 
      success(responseObject); 
     } 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     if (failure) { 
      failure(error); 
     } 
    }]; 

ताकि हम किसी भी क्रमबद्धता के बिना पूरी फ़ाइल प्राप्त कर सकते हैं

1

हाँ, यह AFNetworking 2.0 उपयोग करने के लिए बेहतर है AFHTTPRequestOperationManager के साथ रास्ता। पुराने तरीके से मेरी फाइल डाउनलोड की गई लेकिन किसी कारण से फाइल सिस्टम में अपडेट नहीं हुआ।

उत्तर में डाउनलोड प्रगति दिखाने के लिए AFNetworking 2.0 में आप समान रूप से करते हैं - आउटपुट स्ट्रीम सेट करने के बाद बस प्रगति ब्लॉक डाउनलोड करें।

__weak SettingsTableViewController *weakSelf = self; 

operation.outputStream = [NSOutputStream outputStreamToFileAtPath:newFilePath append:NO]; 

[operation setDownloadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToRead) { 

    float progress = totalBytesWritten/(float)totalBytesExpectedToRead; 

    NSString *progressMessage = [NSString stringWithFormat:@"%@ \n %.2f %% \n %@/%@", @"Downloading ...", progress * 100, [weakSelf fileSizeStringWithSize:totalBytesWritten], [weakSelf fileSizeStringWithSize:totalBytesExpectedToRead]]; 

    [SVProgressHUD showProgress:progress status:progressMessage]; 
}]; 

यह बाइट्स स्ट्रिंग बनाने के लिए मेरी विधि है:

- (NSString *)fileSizeStringWithSize:(long long)size 
{ 
    NSString *sizeString; 
    CGFloat f; 

    if (size < 1024) { 
     sizeString = [NSString stringWithFormat:@"%d %@", (int)size, @"bytes"]; 
    } 
    else if ((size >= 1024)&&(size < (1024*1024))) { 
     f = size/1024.0f; 
     sizeString = [NSString stringWithFormat:@"%.0f %@", f, @"Kb"]; 
    } 
    else if (size >= (1024*1024)) { 
     f = size/(1024.0f*1024.0f); 
     sizeString = [NSString stringWithFormat:@"%.0f %@", f, @"Mb"]; 
    } 

    return sizeString; 
} 
+0

मदद करें जब मैं वीडियो डाउनलोड करता हूं और डाउनलोड पूर्ण होने पर वापस क्लिक करता हूं। और फिर मैं उस वीडियो पर क्लिक करता हूं उस समय मुझे यह त्रुटि मिलती है => MediaPlayerErrorDomain Code = -11800 ... तो कृपया मुझे –

0

पिछले जवाब के अलावा, AFNetworking 2.5.0 और iOS7/8 के साथ मैं ने पाया है कि कि खोलने के अतिरिक्त कदम ऐप को फांसी से रोकने के लिए आउटपुट स्ट्रीम की भी आवश्यकता है (और अंततः स्मृति की कमी से दुर्घटनाग्रस्त)।

operation.outputStream = [NSOutputStream outputStreamToFileAtPath:dest 
                  append:NO]; 
[operation.outputStream open]; 
[operation start]; 
2
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 

manager.responseSerializer = [AFCompoundResponseSerializer serializer]; 

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/octet-stream"]; 

AFHTTPRequestOperation *operation = [manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    if (responseObject) { 
     // your code here 
    } else { 
     // your code here 
    } 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

}]; 

[operation start]; 

// manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject: @ "application/ओकटेट धारा"]; आप क्या उम्मीद

4

Documentation page अनुभाग के साथ 'एक डाउनलोड टास्क बनाना' उदाहरण है के आधार पर भिन्न कर सकते हैं:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 

NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:URL]; 

NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { 
    NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil]; 
    return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]]; 
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { 
    NSLog(@"File downloaded to: %@", filePath); 
}]; 
[downloadTask resume]; 

एनबी! आईओएस 7+ के साथ कोड काम (AFNetworking 2.5.1 के साथ परीक्षण)

+0

मदद करें जब मैं वीडियो डाउनलोड करता हूं और डाउनलोड पूर्ण होने पर वापस क्लिक करता हूं। और फिर मैं उस वीडियो पर क्लिक करता हूं उस समय मुझे यह त्रुटि मिलती है => MediaPlayerErrorDomain Code = -11800 ... तो कृपया मेरी मदद करें –

4

AFNetworking दस्तावेज़ों से। अपने दस्तावेज़ों में लोड की गई फ़ाइल में सहेजें। AFNetworking 3।^ (NSInteger bytesWritten, लंबे totalBytesWritten, लंबे totalBytesExpectedToRead) { फ्लोट: फ़ाइल की प्रगति अपलोड [आपरेशन setDownloadProgressBlock वापस जाने के लिए // सेटअप अपलोड ब्लॉक: 0

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 

NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:URL]; 

NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { 
    NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil]; 
    return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]]; 
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { 
    NSLog(@"File downloaded to: %@", filePath); 
}]; 
[downloadTask resume]; 
संबंधित मुद्दे