Gibt es eine Möglichkeit, die Größe einer Remote-Datei zu ermitteln? http://meine_url/meine_datei.txt ohne die Datei herunterzuladen?
Remote-Dateigröße ohne Herunterladen der Datei
dassouki
NebuSoft
Hab was dazu gefunden Hier:
Hier ist der beste Weg (den ich gefunden habe), um die Größe einer Remote-Datei zu ermitteln. Beachten Sie, dass HEAD-Anforderungen nicht den eigentlichen Text der Anforderung erhalten, sondern nur die Header abrufen. Eine HEAD-Anforderung an eine Ressource mit 100 MB dauert also genauso lange wie eine HEAD-Anforderung an eine Ressource mit 1 KB.
<?php
/**
* Returns the size of a file without downloading it, or -1 if the file
* size could not be determined.
*
* @param $url - The location of the remote file to download. Cannot
* be null or empty.
*
* @return The size of the file referenced by $url, or -1 if the size
* could not be determined.
*/
function curl_get_file_size( $url ) {
// Assume failure.
$result = -1;
$curl = curl_init( $url );
// Issue a HEAD request and follow any redirects.
curl_setopt( $curl, CURLOPT_NOBODY, true );
curl_setopt( $curl, CURLOPT_HEADER, true );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $curl, CURLOPT_USERAGENT, get_user_agent_string() );
$data = curl_exec( $curl );
curl_close( $curl );
if( $data ) {
$content_length = "unknown";
$status = "unknown";
if( preg_match( "/^HTTP\/1\.[01] (\d\d\d)/", $data, $matches ) ) {
$status = (int)$matches[1];
}
if( preg_match( "/Content-Length: (\d+)/", $data, $matches ) ) {
$content_length = (int)$matches[1];
}
// http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
if( $status == 200 || ($status > 300 && $status <= 308) ) {
$result = $content_length;
}
}
return $result;
}
?>
Verwendungszweck:
$file_size = curl_get_file_size( "http://stackoverflow.com/questions/2602612/php-remote-file-size-without-downloading-file" );
-
Aber bedenke das dort kann Antworten ohne Inhaltslänge sein.
– VolkerK
8. April 2010 um 19:26 Uhr
-
Wäre es nicht besser zu verwenden
curl_getinfo
wie @macki vorschlägt?– Svis
29. Februar 2012 um 10:30 Uhr
-
Das hat bei mir so nicht funktioniert
get_user_agent_string()
wurde nicht definiert. Das Entfernen der gesamten Linie hat das Ganze zum Laufen gebracht.– Rapti
23. Juni 2015 um 23:42 Uhr
-
Wenn der Server HEAD nicht unterstützt, wird 405 zurückgegeben
– xiaoyifang
8. September 2017 um 7:17 Uhr
-
Wie bei @Rapti bekam ich eine Fehlermeldung für
get_user_agent_string()
was wahrscheinlich eine lokale Funktion war, die aus dem Code ausgelassen wurde. Es funktioniert, wenn die Zeile auskommentiert ist, aber vielleicht anstelle der Verwendung der Funktion$_SERVER['HTTP_USER_AGENT']
– Cogdog
28. November 2019 um 14:09 Uhr
Versuchen Sie diesen Code
function retrieve_remote_file_size($url){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_NOBODY, TRUE);
$data = curl_exec($ch);
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
curl_close($ch);
return $size;
}
-
Wenn dies für Sie nicht funktioniert, möchten Sie vielleicht hinzufügen
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
.– mermshaus
1. Januar 2014 um 14:27 Uhr
-
Funktioniert bei mir nicht für ein Bild. Ich habe
CURLOPT_FOLLOWLOCATION
auf wahr setzen.– Nate
25. Mai 2014 um 14:12 Uhr
-
@Abenil füge diesen Parameter hinzu. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
– Davinder Kumar
20. Juni 2016 um 7:38 Uhr
-
@ Davinder Kumar: vielen Dank, wenn Sie Ihren Code hinzufügen, funktioniert der obige Code.
– Trung Le Nguyen Nhat
15. Juli 2016 um 6:47 Uhr
-
Keine Ursache! @TrungLeNguyenNhat
– Davinder Kumar
15. Juli 2016 um 10:00 Uhr
Blickfang
Wie bereits mehrfach erwähnt, müssen Sie die Informationen abrufen aus dem Response-Header Content-Length
Bereich.
Das sollten Sie jedoch beachten
- Der Server, den Sie untersuchen, implementiert nicht unbedingt die HEAD-Methode (!)
- Es ist absolut nicht erforderlich, eine HEAD-Anfrage (die wiederum möglicherweise nicht einmal unterstützt wird) manuell zu erstellen
fopen
oder ähnliches oder sogar zum Aufrufen der Curl-Bibliothek, wenn PHP dies getan hatget_headers()
(erinnere dich: KUSS)
Gebrauch von get_headers()
folgt dem KISS-Prinzip und funktioniert auch dann, wenn der Server, den Sie untersuchen, die HEAD-Anforderung nicht unterstützt.
Also, hier ist meine Version (Gimmick: gibt menschenlesbare formatierte Größe zurück ;-)):
Kern: https://gist.github.com/eyecatchup/f26300ffd7e50a92bc4d (Curl- und get_headers-Version)
get_headers()-Version:
<?php
/**
* Get the file size of any remote resource (using get_headers()),
* either in bytes or - default - as human-readable formatted string.
*
* @author Stephan Schmitz <[email protected]>
* @license MIT <http://eyecatchup.mit-license.org/>
* @url <https://gist.github.com/eyecatchup/f26300ffd7e50a92bc4d>
*
* @param string $url Takes the remote object's URL.
* @param boolean $formatSize Whether to return size in bytes or formatted.
* @param boolean $useHead Whether to use HEAD requests. If false, uses GET.
* @return string Returns human-readable formatted size
* or size in bytes (default: formatted).
*/
function getRemoteFilesize($url, $formatSize = true, $useHead = true)
{
if (false !== $useHead) {
stream_context_set_default(array('http' => array('method' => 'HEAD')));
}
$head = array_change_key_case(get_headers($url, 1));
// content-length of download (in bytes), read from Content-Length: field
$clen = isset($head['content-length']) ? $head['content-length'] : 0;
// cannot retrieve file size, return "-1"
if (!$clen) {
return -1;
}
if (!$formatSize) {
return $clen; // return size in bytes
}
$size = $clen;
switch ($clen) {
case $clen < 1024:
$size = $clen .' B'; break;
case $clen < 1048576:
$size = round($clen / 1024, 2) .' KiB'; break;
case $clen < 1073741824:
$size = round($clen / 1048576, 2) . ' MiB'; break;
case $clen < 1099511627776:
$size = round($clen / 1073741824, 2) . ' GiB'; break;
}
return $size; // return formatted size
}
Verwendungszweck:
$url="http://download.tuxfamily.org/notepadplus/6.6.9/npp.6.6.9.Installer.exe";
echo getRemoteFilesize($url); // echoes "7.51 MiB"
Zusätzliche Anmerkung: Der Content-Length-Header ist optional. Also als allgemeine Lösung es ist nicht kugelsicher!
-
Dies sollte die akzeptierte Antwort sein. Wahr,
Content-Length
ist optional, aber es ist die einzige Möglichkeit, die Dateigröße zu erhalten, ohne sie herunterzuladen – undget_headers
ist der beste Weg zu bekommencontent-length
.– Quentin Skousen
31. August 2017 um 22:17 Uhr
-
Beachten Sie, dass dies die Einstellung für die Anforderungsmethode in allen nachfolgenden HTTP-Anforderungen für diesen PHP-Prozess auf HEAD ändert. Verwenden
stream_context_create
um einen separaten Kontext für den Aufruf zu erstellenget_headers
(7.1+).– Mats Lindh
6. Juni 2018 um 9:01 Uhr
-
Ich füge nur hinzu, dass, wenn Ihr URL- oder DOKUMENT-Dateiname Leerzeichen enthält, dies eine -1 zurückgibt
– Jasonflaherty
8. August 2019 um 19:04 Uhr
Sanchit Gupta
PHP-Funktion get_headers()
funktioniert für mich, um das zu überprüfen Inhaltslänge als
$headers = get_headers('http://example.com/image.jpg', 1);
$filesize = $headers['Content-Length'];
Für mehr Details: PHP-Funktion get_headers()
Sicher. Stellen Sie eine Nur-Header-Anfrage und suchen Sie nach der Content-Length
Header.
eine Zeile beste Lösung:
echo array_change_key_case(get_headers("http://.../file.txt",1))['content-length'];
php ist zu lecker
function urlsize($url):int{
return array_change_key_case(get_headers($url,1))['content-length'];
}
echo urlsize("http://.../file.txt");
SCHILDKRÖTE
Ich bin mir nicht sicher, aber könnten Sie dafür nicht die Funktion get_headers verwenden?
$url="http://example.com/dir/file.txt";
$headers = get_headers($url, true);
if ( isset($headers['Content-Length']) ) {
$size="file size:" . $headers['Content-Length'];
}
else {
$size="file size: unknown";
}
echo $size;
-
Mit diesem Beispiel ist es für den Zielserver bei $url möglich, get_headers auszunutzen, um die Verbindung offen zu halten, bis der PHP-Prozess abläuft (indem die Header sehr langsam zurückgegeben werden, aber nicht langsam genug, um die Verbindung veraltet werden zu lassen). Da die gesamten PHP-Prozesse möglicherweise durch FPM begrenzt sind, kann dies eine Art langsamen Loris-Angriff ermöglichen, wenn mehrere „Benutzer“ gleichzeitig auf Ihr get_headers-Skript zugreifen.
– Ted Phillips
12. Oktober 2016 um 16:14 Uhr