AFNetworking downloadTaskWithRequest:progress:destination:completionHandler: 不将文件写入路径

Posted

技术标签:

【中文标题】AFNetworking downloadTaskWithRequest:progress:destination:completionHandler: 不将文件写入路径【英文标题】:AFNetworking downloadTaskWithRequest:progress:destination:completionHandler: not writing file to the path 【发布时间】:2015-06-16 10:44:40 【问题描述】:

我正在尝试使用 AFNetworking (2.5.4) 下载文件。下载完成,调用完成处理程序,错误设置为 nil,一切正常,但目标文件不存在:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSString *fullPath = [valid path from my apps local manager]
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:req progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) 
    return [NSURL URLWithString:fullPath];
 completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) 
    NSLog(@"Saved file to %@.", filePath);
    *** [[NSFileManager defaultManager] fileExistsAtPath:filePath.absoluteString] returns NO here ***
];
[cell.progressView setProgressWithDownloadProgressOfTask:downloadTask animated:YES];
[downloadTask resume];

文件路径是我的应用具有写入权限的常规路径:

/var/mobile/Containers/Data/Application/APP-GUID-REDACTED/Documents/FILE-NAME-REDACTED.docx

我在 AFNetworking 之前使用了不同的方法,它可以写入完全相同的路径。 HTTP 响应标头完美地显示了所有内容(状态 200、正确的内容长度等),如果我 curl 下载 URL,它会毫无问题地下载文件。文件没有问题。

为什么我的目标文件没有写入完成处理程序,尽管没有错误?

更新:我也尝试过AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];,但它没有任何改变。我还尝试创建一个 NSProgress 指针并将其发送给 progress 参数,但无济于事。

【问题讨论】:

【参考方案1】:

使用 [NSURL fileURLWithPath:](不是 URLWithString)。

return [NSURL fileURLWithPath:fullPath];

【讨论】:

【参考方案2】:

这里的问题是错误的文件路径或无效的文件路径。我在这里遇到了同样的问题。

如下所示创建路径:

NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
NSURL *filePathURL = [documentsDirectoryURL URLByAppendingPathComponent:[NSString stringWithFormat:@"your file name here",i]];

现在使用上面的路径:

NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:req progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) 
    return filePathURL;

【讨论】:

复制粘贴,没有任何改变。您的代码生成的路径与我的完全相同,但它再次为零。

以上是关于AFNetworking downloadTaskWithRequest:progress:destination:completionHandler: 不将文件写入路径的主要内容,如果未能解决你的问题,请参考以下文章

URLSession 实例方法`downloadTask` 错误

如何使用 `completionHandler` 为`downloadTask` 编写单元测试?

在 Swift 3 中使用 downloadTask 没有这样的文件或目录错误

URLSession 没有返回位置数据(session:downloadTask:didFinishDownloadingToURL 位置)

URLSession downloadTask 比互联网连接慢得多

`urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)` 在下载内容时只调用一次使用