Le moyen le plus simple de récupérer la taille d'un fichier distant en PHP?

StackOverflow https://stackoverflow.com/questions/1401131

  •  05-07-2019
  •  | 
  •  

Question

Je pensais faire une requête en tête avec cURL, je me demandais si c'était la bonne solution?

Était-ce utile?

La solution

Oui. Comme le fichier est distant, vous êtes totalement dépendant de la valeur de l'en-tête Content-Length (sauf si vous souhaitez télécharger le fichier entier). Vous souhaiterez curl_setopt ($ ch, CURLOPT_NOBODY, true) et curl_setopt ($ ch, CURLOPT_HEADER, true) . .

Autres conseils

La meilleure solution qui respecte le principe KISS

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

J'imagine que l'utilisation de curl pour envoyer une demande HEAD est une possibilité intéressante. quelque chose comme ça ferait probablement:

$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 aurez:

float 3438

De cette façon, vous utilisez une requête HEAD sans télécharger l'intégralité du fichier. Néanmoins, vous dépendez du fait que le serveur distant envoie un en-tête Content-length correct.


Une autre option envisageable serait d’utiliser la taille du fichier ... mais cela échouera : la documentation indique (citant) :

  

Depuis PHP 5.0.0, cette fonction peut   également être utilisé avec certains wrappers d'URL.   Reportez-vous à la Liste des supports pris en charge.   Protocoles / wrappers pour une liste   dont les wrappers supportent stat ()   famille de fonctionnalités.

Et, malheureusement, avec les les wrappers HTTP et HTTPS , stat () n'est pas pris en charge ...

Si vous essayez, vous obtiendrez une erreur comme celle-ci:

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

Dommage: - (

Utiliser une requête HEAD et rechercher Content-Length est le moyen standard de le faire, mais vous ne pouvez pas vous y fier en général, car le serveur pourrait ne pas le prendre en charge. L'en-tête Content-Length est facultatif et le serveur peut même ne pas implémenter la méthode HEAD. Si vous connaissez le serveur sur lequel vous effectuez une vérification, vous pouvez tester son fonctionnement, mais en règle générale, il n’est pas à l’abri.

Si vous n'avez pas besoin d'une solution à l'épreuve des balles, vous pouvez simplement faire:

strlen(file_get_contents($url));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top