我正在使用AFNetworking库。我无法弄清楚如何下载文件并将其保存到文档目录中。如何使用AFNetworking下载文件并将其保存到文档目录中?
回答
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];
我要反弹@ 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];
我肯定会推荐用这种方法用更新的AFNetworking库 – Thomas
@swilliams [AFHTTPRequestOperationManager manager]将使用默认的AFJSONResponseSerializer创建新的管理器对象,你想这么做吗?我认为最好创建AFNoneResponseSerialize以使文件不受影响 – onmyway133
如何获取下载进度参数? – shshnk
我谈论AFNetworking 2.0
[AFHTTPRequestOperationManager manager]
默认AFJSONResponseSerializer创建管理对象,它执行的内容类型的限制。看看这个
- (BOOL)validateResponse:(NSHTTPURLResponse *)response
data:(NSData *)data
error:(NSError * __autoreleasing *)error
因此,我们需要创建一个无响应串并使用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);
}
}];
这样我们就可以得到整个文件,而无需任何系列化
是的,这是更好地使用AFNetworking 2.0
用AFHTTPRequestOperationManager
的方式。用旧的方式我的文件没有下载,但由于某种原因没有在文件系统中更新。
追加到swilliam的回答,展现下载进度,在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;
}
当我下载视频,并点击返回witho下载完成。并再次点击视频,当我得到这个错误=> MediaPlayerErrorDomain代码= -11800 ...所以plz帮助我 –
除了以前的答案,与AFNetworking 2.5.0和iOS7/8我发现,在打开的额外步骤输出流也需要防止应用程序挂起(并最终由于内存不足而崩溃)。
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:dest
append:NO];
[operation.outputStream open];
[operation start];
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:@ “应用程序/八位字节流”];可以根据你所期望的
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];
NB!使用iOS 7+的代码工作(使用AFNetworking 2.5.1进行测试)
当我下载视频,并点击返回witho下载完成。并再次点击视频,当我得到这个错误=> MediaPlayerErrorDomain代码= -11800 ...所以plz帮助我 –
从AFNetworking docs。 将加载的文件保存到您的文档中。 AFNetworking 3。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];
- 1. 下载PDF,保存到文档目录并将其加载到UIWebView中
- 2. ObjC下载文件并将其保存到目录
- 3. 如何使用AFNetworking下载文件并存储在文档文件夹中
- 4. 下载文件并将其自动保存到文件夹
- 5. 下载文件并保存到PHP中的目录中
- 6. 如何从URL下载文件并将其保存在Rails中?
- 7. 如何将iPhone音频文件保存在文档目录中
- 8. 如何使用编程将XML文件下载到黑莓的文档目录?
- 9. 将NSMutableDictionary保存到文档目录
- 10. 将使用翠鸟下载的图像保存到文档目录
- 11. AFNetworking缓存下载文件
- 12. CGPDFDocumentCreateWithURL将文件下载到文档目录中或不是
- 13. 下载保存在目录下自动文件中使用AIR
- 14. 使用POST方法下载XML文件并将其存储在文档目录中
- 15. 如何创建一个文本文件并将其保存到共享目录?
- 16. 如何将文件加载到Iphone文档目录中?
- 17. 如何使用Tango将GPX(XML)文档保存到文件中?
- 18. 下载PDF文件并将其保存到SD卡
- 19. 下载文件并将其保存到SD卡
- 20. 下载文件并保存到内存
- 21. 使用PHP创建CSV文件并将其保存到目录中
- 22. 用相对路径将文件保存在文档目录中?
- 23. 将文件保存到目录中
- 24. iOS:下载并保存文档中的PDF文件app
- 25. 使用iphone保存文档目录中的音频文件
- 26. android studio下载pdf文件并将其保存在sharedpreferences中
- 27. 下载文件并将其保存在独立存储
- 28. Bash:如何读取目录结构并将其缓存到xml文档中
- 29. 如何读取Mongo文档并将其保存到对象?
- 30. 文件上传并保存到目录
您甚至可以添加一个进度块: //设置上传块返回文件的进度上传 [操作setDownloadProgressBlock:^(NSInteger的bytesWritten,长长totalBytesWritten,很长很长totalBytesExpectedToRead){ 浮动progress = totalBytesWritten /(float)totalBytesExpectedToRead; NSLog(@“Download Percentage:%f %%”,progress * 100); }]; – Climbatize
请注意,上面的代码将下载从服务器到输出流的任何响应,因此如果服务器以状态码404响应,则404页面将保存到指定的路径。您必须检查operation.response.statusCode的成功块。 – leolobato
这在iOS6上适用于我。谢谢@mattt –