我有一个问题,我想获取我放在文本字段中的链接的文件大小,并在开始下载之前将其显示在标签中。
我用[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];
答案 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,所以请处理这种情况。