Как узнать размер файла, скачивается он или нет?

Я использую следующий код для загрузки epub / pdf с URL-адреса. Мне нравится показывать индикатор выполнения, поэтому, когда я начинаю загрузку, он показывает прогресс, а когда загрузка завершается, появляется всплывающее сообщение. Как я могу реализовать это?

Мой код для загрузки файла

-(void)Download
 {
    NSData *pdfData = [[NSData alloc] initWithContentsOfURL:[NSURL    URLWithString:@"http://www.feedbooks.com/book/3471.epub"]];

    //Store the Data locally as epub  File if u want pdf change the file extension  

    NSString *resourceDocPath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle]  resourcePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Documents"]];

    NSString *filePath = [resourceDocPath stringByAppendingPathComponent:@"3471.epub"];

    [pdfData writeToFile:filePath atomically:YES];
    NSLog(@"%@",filePath);
 }

Я использую эти коды в своем файле .m, но у меня это не работает.

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    _totalFileSize = response.expectedContentLength;
    responseData = [[NSMutableData alloc] init];
}


-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    _receivedDataBytes += [data length];
    MyProgressBar.progress = _receivedDataBytes / (float)_totalFileSize;
    [responseData appendData:data];
}

person Naveen    schedule 18.04.2013    source источник
comment
stackoverflow.com/a/14313172/1228669 может быть этот ответ связан с вашим вопросом   -  person prasad    schedule 18.04.2013
comment
возможный дубликат Добавить UIProgressView в NSURLConnection?   -  person ldav1s    schedule 19.04.2013


Ответы (3)


использовать NSURLConnection

в файле .h

double datalength;
NSMutableData *databuffer;
UIProgressView *progress;

в файле .m

-(void)Download
{
      NSURLConnection *con=[[NSURLConnection alloc]initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.feedbooks.com/book/3471.epub"]] delegate:self startImmediately:YES];
      [con start];
}

методы делегирования

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    datalength = [response expectedContentLength];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [databuffer appendData:data];
    progress.progress = (databuffer.length/datalength);
    self.HUD.detailsLabelText = [NSString stringWithFormat:@"Downloading  %.f  %%",(databuffer.length/datalength)*100];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSString *resourceDocPath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle]  resourcePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Documents"]];
    NSString *filePath = [resourceDocPath stringByAppendingPathComponent:@"3471.epub"];
    [pdfData writeToFile:filePath atomically:YES];
    NSLog(@"%@",filePath);
}
person Manu    schedule 18.04.2013
comment
метод делегирования в файле appdelege.m ryt a - person Naveen; 18.04.2013
comment
неа.. в yourViewController.h ?? если вы используете его из appDelegate, используйте это - person Manu; 18.04.2013
comment
Я добавил код ur ur .h в свой код viewcontroller .h, ur .m в мою функцию загрузки внутри файла .m, и где я добавляю методы делегирования? - person Naveen; 18.04.2013
comment
только в .m вам нужно вставить методы делегата, которые я написал - person Manu; 18.04.2013
comment
УДАЛИТЕ это без проблем. Это просто MBProgressHUD - person Manu; 18.04.2013
comment
из-за необработанного исключения «NSUnknownKeyException», причина: «[‹GMMDetailpage 0x11372b30› setValue: forUndefinedKey:]: этот класс не соответствует кодированию значения ключа для ключа Pro_view1». - person Naveen; 18.04.2013
comment
где-то вы устанавливаете неправильное значение для ключа... однажды проверьте его - person Manu; 18.04.2013

Если вы сделаете curl -vvv -o epub.pdf http://www.feedbooks.com/book/3471.epub, вы увидите следующую строку:

Content-Length: 603244

Заголовок content-length — это размер загружаемых данных в байтах. Вы можете использовать это для отслеживания своего прогресса при записи данных.

Однако с вашим текущим кодом вы не можете делать то, что хотите. Вы должны проверить этот ответ для получения дополнительной информации.

person NG.    schedule 18.04.2013

Вы можете проверить data длину NSData. Затем вы найдете фактически загруженные данные.

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
{
    // append the new data to the receivedData

    [receivedData appendData:data];
}

Здесь вы получите длину данных в байтах. Вы можете преобразовать его в соответствии с вашими потребностями.

Это может помочь вам.

person Nirav Jain    schedule 18.04.2013