可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
Wanted to find size of a file on some server before downloading it in iOS 7... I have a method of NSURLConnectionDelegate but it is deprecated after iOS 4.3
Here was that method:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
回答1:
You should instead use the NSURLConnectionDataDelegate
Note: DATADelegate
and its didReceiveResponse:
method to send a HEAD request to get just the header:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
Then you can get the response size with @Port's suggestion:
long long size = [response expectedContentLength];
回答2:
Make a request using the HEAD method. For example:
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"HEAD"];
This request will be identical to a GET but it won't return the body. Then call
long long size = [response expectedContentLength];
Complete example with NSURLConnection (works for NSURLSession too of course):
NSURL *URL = [NSURL URLWithString:@"http://www.google.com"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
[request setHTTPMethod:@"HEAD"];
NSHTTPURLResponse *response;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error: nil];
long long size = [response expectedContentLength];
NSLog(@"%lld",size);
This is also useful to conditionally download based on the Last-Modified header (assuming that the server sends you that).
if ([response respondsToSelector:@selector(allHeaderFields)]) {
NSString *lastModifiedString = [[response allHeaderFields] objectForKey:@"Last-Modified"];
}
回答3:
you can use this method,NSURLResponse object which is passed to the following delegate methods:
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
}
-(NSURLRequest *)connection:(NSURLConnection *)connection
willSendRequest:(NSURLRequest *)request
redirectResponse:(NSURLResponse *)response {
}
try like this..
long long size = [response expectedContentLength];
回答4:
For Swift use these steps,
Step 1: Use NSURLConnectionDataDelegate.
class ViewController: UIViewController,NSURLConnectionDataDelegate {
Step 2: Create request for connection.
var request:NSMutableURLRequest = NSMutableURLRequest(URL: NSURL(string: "http://www.twitter.com")!)
// Use **HEAD** request to get http header information.
request.HTTPMethod = "HEAD"
Step 3: Create connection.
var connection:NSURLConnection = NSURLConnection(request: request, delegate: self)!
Step 4: Use delegate method of NSURLConnectionDataDelegate
func connection(connection: NSURLConnection, didReceiveResponse response: NSURLResponse)
{
var size = response.expectedContentLength
println("size : \(size)")
}
Here is full code...
import UIKit
class ViewController: UIViewController,NSURLConnectionDataDelegate {
override func viewDidLoad() {
super.viewDidLoad()
var request:NSMutableURLRequest = NSMutableURLRequest(URL: NSURL(string: "http://www.twitter.com")!)
request.HTTPMethod = "HEAD"
var connection:NSURLConnection = NSURLConnection(request: request, delegate: self)!
}
func connection(connection: NSURLConnection, didReceiveResponse response: NSURLResponse)
{
var size = response.expectedContentLength
println("size : \(size)")
}
}
回答5:
try this will help . . . . .
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse
*)response
{
NSHTTPURLResponse * pHttpUrlResponse = (NSHTTPURLResponse *) response;
if ([response respondsToSelector:@selector(allHeaderFields)])
{
NSString * fileLength = [NSString stringWithFormat:@"%lld",[pHttpUrlResponse expectedContentLength]];
}
}
happy coding :)
回答6:
Also using URlSession
you can get the file size like this without downloading actual data:
func getPdfSize(for url: URL) {
var request = URLRequest(url: url)
request.httpMethod = "HEAD"
URLSession.shared.dataTask(with: request) { [weak self] (_, response, _) in
if let response = response {
let size = response.expectedContentLength
DispatchQueue.main.async {
self?.fileSizeLabel.text = ByteCountFormatter.string(fromByteCount: size, countStyle: .file)
}
}
}.resume()
}
Notice also you can use the native iOS ByteCountFormatter
to format the byte count into a readable string.
Code in Swift 5
回答7:
Try this,
NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:URL error:&attributesError];
NSNumber *fileSizeNumber = [fileAttributes objectForKey:NSFileSize];
long long fileSize = [fileSizeNumber longLongValue];
:)