質問

I am trying to download file from server using afnetworking from iPad.

I can successfully download file. But, strangely, my totalBytesExpectedToRead is always -1 although totalBytesRead is correct. Where did I make mistake?

[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead)
{
}

Whole code is here.

-(void)fileDownload : (NSString *)pathToDownload : (NSString *)fileExt
{
    hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    hud.mode = MBProgressHUDModeAnnularDeterminate;
    hud.labelText=@"Downloading...";

    NSLog(@"fileDownload and pathToDownload is %@",pathToDownload);

    NSArray *parts = [pathToDownload componentsSeparatedByString:@"\\"];
    NSString *fileName = [NSString stringWithFormat:@"%@",[parts objectAtIndex:[parts count]-1]];

    if([fileExt isEqualToString:@"pdf"])
    {
        fileNameForAllThreeFile=[fileName stringByDeletingPathExtension];
    }

    NSLog(@"fileName is %@",fileName);

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",IP_ADDRESS,download_recording]];

    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
    [httpClient setAuthorizationHeaderWithUsername:usernameForAuth password:passwordForAuth];

    NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:                            
                            pathToDownload,@"file",
                            nil];
    NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:download_recording parameters:parameters];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    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)
    {
        NSString *responseStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSLog(@"Request Successful in fileDownload, response '%@'", responseStr);

        NSLog(@"Successfully downloaded file to %@", path);
        [self messageDisplay:@"File download complete" :[NSString stringWithFormat:@"%@ download is now complete.",fileName]];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error)
    {
        NSLog(@"Error in retrieveFromCustomServer: %@", error.localizedDescription);
        [self performSelectorInBackground:@selector(hideHUDInBackground) withObject:nil];

    }];
    [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead)
    {
        //do something in this line with the calculation to cell
        // float progress = (float)totalBytesRead / totalBytesExpectedToRead;
        NSLog(@"Downloaded %lld of %lld bytes", totalBytesRead, totalBytesExpectedToRead);
        float perCent = totalBytesRead / (float)totalBytesExpectedToRead;
        hud.progress = perCent ;
        NSLog(@"Percent is %d and in float is %f",(int)(perCent *100),perCent);
    }];
    [operation start];
}
役に立ちましたか?

解決

totalBytesExpectedToRead is -1 if the Content-Length HTTP header isn't provided by the server. See RFC 2616, section 14.13.

You should either add this header to your server, or handle -1 by showing a UIActivityIndicator instead of a UIProgressView.

Or, in your case, using MBProgressHUD:

hud.mode = MBProgressHUDModeIndeterminate;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top