如何在iOS 7中在下载文件之前找到文件的大小?

6

我想在下载iOS 7上的文件之前找到服务器上文件的大小... 我有一个NSURLConnectionDelegate的方法,但这个方法在iOS 4.3之后就已经被弃用了。

以下是该方法:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

请查看这个 Swift 4 的解决方案:https://dev59.com/YoTba4cB1Zd3GeqP1Bjr#48584914 - fethica
7个回答

10

使用HEAD方法发出请求。例如:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"HEAD"];

这个请求与GET请求完全相同,但不会返回主体。然后调用

long long size = [response expectedContentLength];

使用 NSURLConnection 的完整示例(当然也适用于 NSURLSession):

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);

如果服务器发送了Last-Modified标头,这也很有用,可以根据它进行有条件的下载。

if ([response respondsToSelector:@selector(allHeaderFields)]) {
    NSString *lastModifiedString = [[response allHeaderFields] objectForKey:@"Last-Modified"];
}

2
你应该使用NSURLConnectionDataDelegate而不是DATADelegate,然后使用它的didReceiveResponse:方法发送HEAD请求以仅获取标头:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;

然后,您可以使用@Port的建议获取响应大小:
long long size = [response expectedContentLength];

非常感谢,非常有帮助!NSURLCONNECTIONDELEGATE有许多方法已经被弃用,现在这些方法都在NSURLCONNECTIONDATADELEGATE中呈现! - asadullah07

1

如果您想使用 Swift,请按照以下步骤进行操作:

步骤1:使用 NSURLConnectionDataDelegate

class ViewController: UIViewController,NSURLConnectionDataDelegate {

步骤2:创建连接的请求
var request:NSMutableURLRequest = NSMutableURLRequest(URL: NSURL(string: "http://www.twitter.com")!)

// Use **HEAD** request to get http header information.

request.HTTPMethod = "HEAD"

第三步:创建连接。
var connection:NSURLConnection = NSURLConnection(request: request, delegate: self)!

第四步:使用NSURLConnectionDataDelegatedelegate方法。
func connection(connection: NSURLConnection, didReceiveResponse response: NSURLResponse)
{
    var size = response.expectedContentLength
    println("size : \(size)")
}

这是完整的代码...
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)")
}
}

这是以字节为单位的大小吗? - Yaroslav Dukal
@RayKing,“因此,在大多数现代平台上,您可以假定字节单位为8位长。” 在这里查看:http://stackoverflow.com/a/31389001/3411787 - Mohammad Zaid Pathan

1
你可以使用这个方法,将NSURLResponse对象传递给以下委托方法:
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

}
-(NSURLRequest *)connection:(NSURLConnection *)connection
        willSendRequest:(NSURLRequest *)request
       redirectResponse:(NSURLResponse *)response {
}

尝试像这样...
long long size = [response expectedContentLength];

它也已被弃用。 - asadullah07
  • connection:needNewBodyStream
  • connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite: 该方法可用于iOS 3.0至iOS 4.3版本。
  • connection:didReceiveData: 该方法可用于iOS 2.0至iOS 4.3版本。
  • connection:didReceiveResponse: 该方法可用于iOS 2.0至iOS 4.3版本。
  • connection:willCacheResponse: 该方法可用于iOS 2.0至iOS 4.3版本。
  • connection:willSendRequest:redirectResponse: 该方法可用于iOS 2.0至iOS 4.3版本。
  • connectionDidFinishLoading: 该方法可用于iOS 2.0至iOS 4.3版本。
- asadullah07

0

同时,使用URLSession,您可以在不下载实际数据的情况下获取文件大小:

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()
}

请注意,您还可以使用本机iOS ByteCountFormatter将字节计数格式化为可读字符串。

Swift 5代码


0

试试这个,会有帮助的……

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse
                                                                      *)response
{
    NSHTTPURLResponse * pHttpUrlResponse = (NSHTTPURLResponse *) response;

    if ([response respondsToSelector:@selector(allHeaderFields)])
    {
        NSString * fileLength = [NSString stringWithFormat:@"%lld",[pHttpUrlResponse expectedContentLength]];
    }    
}

编程愉快 :)


这是我在问题中列出的已弃用的方法。 - asadullah07

-1

试试这个,

NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:URL error:&attributesError];
NSNumber *fileSizeNumber = [fileAttributes objectForKey:NSFileSize];
long long fileSize = [fileSizeNumber longLongValue];

:)


这是针对已经下载的文件,不适用于网络上的文件。 - asadullah07
好的...我认为你需要使用FTP。 - Shreyansh Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接