Accueil > Code > Taille d’un fichier distant sur un serveur HTTP

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.

Categories: Code Tags:
  1. patcheco
    27/06/2008 à 10:20 | #1

    Ton code ne marche pas, ou ne marche plus en php5

  1. Pas encore de trackbacks