Taille d’un fichier distant sur un serveur HTTP
Deux fois ce soir, eh bien, c’est un jour faste.
J’ai eut besoin pour la barre de progression AJAX de récupérer la taille d’un fichier distant sur un serveur HTTP. La fonction filesize() de PHP ne permettant pas de vérifier la taille d’une cible sur HTTP, j’ai du me rabattre sur une solution plus manuelle.
Je suis tombée dans la doc’ sur une fonction utilisant la librairie CURL. Mais bon, CURL, c’est pas standard, et puis c’était trop facile…
Alors voici une fonction qui permet de récupérer la taille d’un fichier stocké sur un serveur HTTP distant:
/* ** Fonction: http_filesize ** Retourne la taille d'un fichier sur un serveur ** HTTP. ** Paramètres: ** $sURL - Adresse du fichier ** $nTimeout - Timeout du socket HTTP \[d:30s] */ function http_filesize($sURL, $nTimeout = 30) { // Traitement de l'URL $aURL = parse_url($sURL); // La requête est-elle bien HTTP? if(@$aURL\['scheme'] != 'http') return false; // Récuperation du host du serveur... $sHost = $aURL\['host']; // Et du chemin du fichier distant ainsi que du query string... $sFilepath = (isset($aURL\['path']) ? $aURL\['path'] : '/'); $sFilepath .= (isset($aURL\['query']) ? '?' . $aURL\['query'] : ''); // Récuperation du port, ou mise par défaut au port HTTP 80 $nPort = isset($aURL\['port']) ? $aURL\['port'] : 80; // Ouverture du socket $fpRemote = fsockopen($sHost, $nPort, $errno, $errstr, $nTimeout); // On vérifie si le socket s'est bien ouvert if(!$fpRemote) return false; else { // Préparation des entêtes de la requête $sHeaders = "HEAD " . $sFilepath . " HTTP/1.1\r\n"; $sHeaders .= "Host: ". $sHost . "\r\n"; $sHeaders .= "Connection: Close\r\n\r\n"; // Envoi des entêtes fwrite($fpRemote, $sHeaders); // Récuperations de la réponse $sRemoteHeaders = ''; while(!feof($fpRemote)) $sRemoteHeaders .= fgets($fpRemote, 128); // Fermeture du socket fclose($fpRemote); // Récuperation de la taille du fichier distant si disponible preg_match('/Content-Length:\s(\[0-9].+?)\s/', $sRemoteHeaders, $aMatches); if(isset($aMatches\[1])) return (int)$aMatches\[1]; else return false; } }
En esperant que ça vous soit utile! Allez, salut.
Ton code ne marche pas, ou ne marche plus en php5