使用afnetworking下载之前获取文件大小

时间:2015-05-23 10:41:50

标签: objective-c cocoa afnetworking nsurl

我有一个问题,我想获取我放在文本字段中的链接的文件大小,并在开始下载之前将其显示在标签中。 我用[operation.response expectedContentLength]完成了一些事情。 我只得到0.我在.m文件中的代码是这样的:

    NSString *fileName = [self.linkTextBox.stringValue lastPathComponent];

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[self.linkTextBox stringValue]]];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    NSLog(@"size :%lld", [operation.response expectedContentLength]);
    self.detailText.stringValue = [NSString stringWithFormat:@"%lld", [operation.response expectedContentLength]];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:fileName];
    operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];
      [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
      NSLog(@"bytesRead: %lu, totalBytesRead: %lld, totalBytesExpectedToRead: %lld", (unsigned long)bytesRead, totalBytesRead, totalBytesExpectedToRead);
}];
     [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation   *operation, id responseObject) {
            NSLog(@"Successfully downloaded file to %@", path);
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"Error: %@", error);
        }];

        [operation start];

2 个答案:

答案 0 :(得分:1)

您可以发送HEAD个请求而不是GET个请求,这会要求服务器仅向您发送请求的标头。大多数服务器都支持此功能,当您想要获取有关您正在查询的实体的元数据信息时,它是更好的方法,而无需下载它。

HEAD请求可以通过创建NSMutableURLRequest并设置HTTPMethod属性来实现,如下所示:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:anURL];
request.HTTPMethod = @"HEAD";
// the rest of the code

这假设服务器开发人员完成了他的工作,他期待HEAD个请求并填充相应的http标头字段。

答案 1 :(得分:0)

在下载之前你无法获得长度,但是一旦你开始得到回复你就可以得到它。

您想使用class_alias(),这是AFHTTPRequestOperation超级类AFURLConnectionOperation上的一种方法。回调有三个参数,第三个参数是totalBytesExpectedToRead

[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
    if (totalBytesExpectedToRead > 0) {
        // Do stuff...
    }
}];

正如其他人所说,如果服务器没有在HTTP响应中设置内容长度标头,那么该值可以为0,所以请处理这种情况。