我想从网络服务器下载文件。
方案: 用户将选择行(文件名 - 用户可以选择一个或多个要下载的文件)并按下载,我将获取每个文件的URL(所有文件都有不同的URL)并存储到pathArray中。 并做以下
-(void)downloadFile {
for (int i = 0; i<[pathArray count]; i++) {
NSURL *fileURL = [NSURL fileURLWithPath:[pathArray objectAtIndex:i]];
NSString *ResultURL = [fileURL absoluteString];
NSURL *url = [[NSURL alloc] initWithString:ResultURL];
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL: url
cachePolicy: NSURLRequestReloadIgnoringCacheData timeoutInterval: 60.0];
conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
if (conn) {
NSLog(@"*************CONNECTED************");
webData = [[NSMutableData data] retain];
NSLog(@"weblength : %d : ", [webData length]);
downloadTag = YES;
} else {
NSLog(@"*************Connection NOT DONE************");
downloadTag=NO;
}
}
}
-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSLog(@"*************Try to receive data************");
[webData appendData:data];
NSLog(@"weblength : %d : ", [webData length]);
NSLog(@"*************Data Received an append too ***********");
if (downloadTag == YES) {
paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
self.documentsDir = [[paths objectAtIndex:0]stringByAppendingPathComponent:@"NewResult.zip" ];
[[NSFileManager defaultManager] createFileAtPath:documentsDir contents:nil attributes:nil];
NSFileHandle *file1 = [NSFileHandle fileHandleForUpdatingAtPath: documentsDir];
[file1 writeData: webData];
NSLog(@"Webdata : %d",[webData length]);
[file1 closeFile];
}
}
如果我不使用for循环,即只有一个文件下载,那么它工作正常,但不是for for循环......对我来说解决这个问题非常重要。
非常感谢
答案 0 :(得分:2)
看看ASIHTTPRequest,它有一个很好的队列来下载和监控进度http://allseeing-i.com/ASIHTTPRequest/How-to-use
答案 1 :(得分:1)
您正在使用异步下载,但每个下载项的委托都是同一个对象,导致所有下载的数据都附加到同一个文件中。我这样做的方法是让一个小的Object(DownloadQueueItem)作为单个下载的委托。当您下载另一个文件时,您将创建一个新的DownloadQueueItem并处理所有内容。
编辑:
问: 而不是%i我自己正在搜索有没有办法每次创建新文件,如果“”NewResult.zip“存在则创建”NewResult1 .zip“等等
A:您可以这样做:
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filename = @"NewResult%@.zip";
for (int i = 0; ; i++) {
NSString *filename = NULL;
if (i == 0) {
filename = [NSString stringWithFormat:filename, @""];
}
else {
filename = [NSString stringWithFormat:filename, [NSString stringWithFormat:@"%i", i]];
}
if (![[NSFileManager defaultManager] fileExistsAtPath:filename]) {
// Save file.
break;
}
}