Der einfachste Weg, Größe von Remote-Datei in PHP zu greifen?
Frage
Ich dachte an einen Kopf Anfrage mit curl tun, frage mich, ob dies der Weg zu gehen?
Lösung
Ja. Da die Datei entfernt ist, sind Sie völlig abhängig von dem Wert des Content-Length
Header (es sei denn, Sie die ganze Datei herunterladen möchten). Sie wollen curl_setopt($ch, CURLOPT_NOBODY, true)
und curl_setopt($ch, CURLOPT_HEADER, true)
.
Andere Tipps
Die beste Lösung, die das KISS-Prinzip folgt
$head = array_change_key_case(get_headers("http://example.com/file.ext", TRUE));
$filesize = $head['content-length'];
Ich vermute, mit curl eine HEAD-Anfrage zu senden ist eine schöne Möglichkeit; so etwas wie dies würde wahrscheinlich tun:
$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);
Und erhalten Sie:
float 3438
Auf diese Weise Sie eine HEAD-Anforderung verwendet wird, und nicht die gesamte Datei heruntergeladen - nach wie vor hängen Sie auf dem Remote-Server einen richtigen Content-Length-Header senden
.
Eine weitere Option, die Sie über vielleicht denken wäre an filesize
verwenden ... Aber wird dies scheitern : In der Dokumentation (Zitat) :
Ab PHP 5.0.0 kann diese Funktion auch mit einigem URL-Wrapper verwendet werden. Siehe href="http://php.net/manual/en/wrappers.php" rel="noreferrer"> Liste der unterstützten zum für eine Liste von denen Wrapper unterstützen stat () Familie der Funktionalität.
Und leider mit HTTP und HTTPS-Wrapper wird stat()
nicht unterstützt ...
Wenn Sie versuchen, werden Sie eine Fehlermeldung erhalten, wie folgt:
Warning: filesize() [function.filesize]: stat failed
for http://sstatic.net/so/img/logo.png
Schade: - (
Mit einer HEAD-Anforderung und Überprüfung für Content-Length
ist der normale Weg, es zu tun, aber man kann auf sie in der Regel nicht verlassen, da der Server nicht unterstützen könnte. Der Content-Length
Header ist optional, und der Server ferner vielleicht nicht einmal die HEAD-Methode implementieren. Wenn Sie wissen, welche Server Sie Sondieren, dann können Sie testen, ob es funktioniert, aber als allgemeine Lösung ist es nicht kugelsicher.
Wenn Sie nicht über eine kugelsichere Lösung brauchen Sie nur tun können:
strlen(file_get_contents($url));