2009-09-09 6 views

Répondre

8

Oui. Comme le fichier est distant, vous dépendez complètement de la valeur de l'en-tête Content-Length (sauf si vous voulez télécharger le fichier entier). Vous voulez curl_setopt($ch, CURLOPT_NOBODY, true) et curl_setopt($ch, CURLOPT_HEADER, true).

10

Je suppose que l'utilisation de curl pour envoyer une requête HEAD est une possibilité intéressante; quelque chose comme cela ferait sans doute:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://sstatic.net/so/img/logo.png'); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_exec($ch); 
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); 
var_dump($size); 

Et vous obtiendrez:

float 3438 

De cette façon, vous utilisez une requête HEAD, et non le téléchargement du fichier entier - encore, vous dépendent du Le serveur distant envoie un en-tête Content-length correct.


Une autre option que vous pourriez penser à serait d'utiliser filesize ... Mais cela ne fonctionne pas: la documentation indique (citant):

PHP 5.0.0, cette La fonction peut également être utilisée avec certains wrappers d'URL. Référez-vous à List of Supported Protocols/Wrappers pour une liste dont les wrappers supportent stat() famille de fonctionnalités.

Et, malheureusement, avec HTTP and HTTPS wrappers, stat() est pas pris en charge ...

Si vous essayez, vous obtiendrez une erreur, comme ceci:

Warning: filesize() [function.filesize]: stat failed 
    for http://sstatic.net/so/img/logo.png 

Dommage :-(

1

L'utilisation d'une requête HEAD et la recherche de Content-Length constituent la manière standard de le faire, mais vous ne pouvez pas vous y fier en général, car le serveur peut ne pas le prendre en chargeL'en-têteest facultatif et, de plus, le serveur pourrait même ne pas implémenter la méthode HEAD. Si vous connaissez le serveur que vous testez, vous pouvez tester si cela fonctionne, mais en règle générale, il n'est pas à l'épreuve des balles.

+0

oui, avec ceci: http: // php. net/manual/fr/function.get-headers.php – Merlinox

1

Si vous n'avez pas besoin d'une solution pare-balles vous pouvez juste faire:

strlen(file_get_contents($url)); 
+4

Cela fonctionnera, mais il faudra également télécharger le fichier en premier. Vraisemblablement, il veut connaître la taille avant de le récupérer sur le réseau. – troelskn

49

La meilleure solution qui suit le principe KISS

$head = array_change_key_case(get_headers("http://example.com/file.ext", TRUE)); 
$filesize = $head['content-length']; 
+8

De loin la meilleure réponse. Bien fait. –

+2

Cette commande ne retourne pas une clé 'contenu-longueur' pour moi, voici le tableau qu'il retourne: ''connection' => chaîne 'close' (longueur = 5) 'date' => chaîne 'mar, 03 Jun 2014 20:55:55 GMT '(longueur = 29) ' server '=> chaîne' Microsoft-IIS/6.0 '(longueur = 17) ' x-powered-by '=> chaîne' ASP.NET '(longueur = 7) ' x-aspnet-version '=> chaîne' 4.0.30319 '(longueur = 9) ' cache-control '=> chaîne' privée '(longueur = 7) ' content-type '=> chaîne' image/gif'' –

+2

Question rapide, pourquoi faut-il array_change_key_case? – mario

Questions connexes