OVH Cloud OVH Cloud

taille fichier

6 réponses
Avatar
fred
Bonjour,

Existe-t-il un moyen de recuperer la taille d'un fichier distant autrement
qu'en fesant un fopen pour recuperer la totalité du fichier et calculer sa
taille
selon le "buffer" ? J'utilise en effet cette methode mais ca ralenti pas mal
mon script...

Merci pour votre aide
Fred.

6 réponses

Avatar
Sebastien
fred wrote:
Bonjour,

Existe-t-il un moyen de recuperer la taille d'un fichier distant autrement
qu'en fesant un fopen pour recuperer la totalité du fichier et calculer sa
taille
selon le "buffer" ? J'utilise en effet cette methode mais ca ralenti pas mal
mon script...

Merci pour votre aide
Fred.


Fais une requête HTTP HEAD sur le fichier distant (voir les fonctions de
manipulation de sockets). Parse la réponse du serveur et récupère le
Content-Length ;)

Avatar
Dominique Ottello
"fred" écrivait :

Bonjour,


Bonsoir,

Existe-t-il un moyen de recuperer la taille d'un fichier distant autrement
qu'en fesant un fopen pour recuperer la totalité du fichier et calculer sa
taille


Je suis très loin d'être un "gourou" du PHP, mais pour les tailles de
fichiers et selon ce qui est écrit à :

http://www.nexen.net/docs/php/annotee/function.filesize.php

j'utilise :

filesize() Renvoie la taille du fichier
[ Exemples avec filesize ] PHP 3, PHP 4 , PHP 5

Description
int filesize ( string filename )

filesize renvoie la taille du fichier filename , ou FALSE en cas
d'erreur.

Note :
Comme le type entier de PHP est signé et que de nombreuses plates-formes
utilisent des entiers de 32 bits, filesize peut retourner des résultats
étranges pour les fichiers de taille supérieure à 2 Go. Pour les
fichiers entre 2 et 4 Go, cela peut être contourné avec sprintf("%u",
filesize($file)) .

Note :
Les résultats de cette fonction sont mis en cache. Voyez la fonction
clearstatcache plus de détails.

Depuis PHP 5.0.0 cette fonction peut aussi être utilisée avec quelques
protocoles url. Lisez Liste des protocoles supportés pour une liste des
protocoles supportant la famille de fonctionnalités de stat .

Exemple avec filesize
<?php

// outputs e.g. unfichier.txt: 1024 octets

$filename = 'unfichier.txt';
echo $filename . ': ' . filesize($unfichier) . ' octets';
?>
--
= Dominique Ottello = http://www.ottello.net
Aujourd'hui, l'idéal du progrès est remplacé par l'idéal de l'innovation :
il ne s'agit pas que ce soit mieux, il s'agit seulement que ce soit nouveau,
même si c'est pire qu'avant et cela de toute évidence. Montherlant

Avatar
Kevin
Bonjour,
Bonsoir :)


ce que tu cherches est impossible a faire avec fopen, il faut utiliser
les sockets, et faire une requete http afin de demanger la
recupereration du fichier. puis dans la premiere trame de reponse ce
trouve (logiquement) "Content-Length" qui est la taille du fichier en octets

exemple de trame:

<< requette client >>
GET /spamcombat.zip HTTP/1.1
Host: mirror1.glocksoft.com
Connection: Close



<< reponse serveur >>
HTTP/1.1 200 OK
Server: Apache/1.3.23 (Unix)
Content-Type: application/x-zip-compressed
Date: Thu, 09 Sep 2004 20:36:15 GMT
Last-Modified: Wed, 08 Sep 2004 13:27:45 GMT
Accept-Ranges: bytes
Connection: close
Content-Length: 3826360


bref il faut fermer la connexion dès que tu as recuperé le
"Content-Length" ou un double saut de ligne (separation entre les
entetes et les données, donc synonyme de l'absence de cette info)
sinon il va continuer en boucle :)

un petit exemple de script avec les sockets pour http (extrait de php.net)

<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />n";
} else {
$out = "GET / HTTP/1.1rn";
$out .= "Host: www.example.comrn";
$out .= "Connection: Closernrn";

fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>

qq trucs a modifier pr que ca marche mais pas vraiment grand chose :)

j'te laisse reflechir et si tu n'arrives pas redemande, et je t'aiderai
alors :)


Bonne soirée

Kevin
--
=> Pour me mailer, virez toutes les voyelles de la partie avant
l'arobase: naegoo @ pulsed . net

Coders don't die... they just JMP without RET

Avatar
Sebastien
Kevin wrote:

<< requette client >>
GET /spamcombat.zip HTTP/1.1
Host: mirror1.glocksoft.com


Un HEAD permet de récupérer juste l'en-tête de la réponse, contrairement
au GET qui envoie le tout ;)

Avatar
Kevin
Un HEAD permet de récupérer juste l'en-tête de la réponse, contrairement
au GET qui envoie le tout ;)


sans doute :) je ne connais pas toutes les rfc par coeur :)

--
Coders don't die... They just JMP without RET

Avatar
loufoque
Kevin a dit le 10/09/2004 00:46:
GET /spamcombat.zip HTTP/1.1


HTTP/1.1 ? Et tu gères où le fameux chunked ?