Gibt es eine Möglichkeit, die Größe einer Remote-Datei http: //my_url/my_file.txt zu ermitteln, ohne die Datei herunterzuladen?
84
Gibt es eine Möglichkeit, die Größe einer Remote-Datei http: //my_url/my_file.txt zu ermitteln, ohne die Datei herunterzuladen?
Hier etwas dazu gefunden :
Hier ist der beste Weg (den ich gefunden habe), um die Größe einer entfernten Datei zu erhalten. Beachten Sie, dass HEAD-Anforderungen nicht den tatsächlichen Hauptteil der Anforderung erhalten, sondern nur die Header abrufen. Das Erstellen einer 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;
}
?>
Verwendung:
$file_size = curl_get_file_size( "http://stackoverflow.com/questions/2602612/php-remote-file-size-without-downloading-file" );
curl_getinfo
, wie @macki vorschlägt?get_user_agent_string()
nicht definiert. Durch das Entfernen der gesamten Linie funktionierte das Ganze.http://www.dailymotion.com/rss/user/dialhainaut/
siehe SO: stackoverflow.com/questions/36761377/…Versuchen Sie diesen Code
quelle
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
.CURLOPT_FOLLOWLOCATION
auf wahr gesetzt.Wie bereits einige Male erwähnt, müssen Sie die Informationen aus dem
Content-Length
Feld des Antwortheaders abrufen .Beachten Sie dies jedoch
fopen
oder ähnlich zu erstellen oder die Curl-Bibliothek aufzurufen, wenn PHP dies getan hatget_headers()
(denken Sie daran: KISS ).Die Verwendung von
get_headers()
folgt dem KISS-Prinzip und funktioniert auch dann, wenn der Server, den Sie prüfen, die HEAD-Anforderung nicht unterstützt.Also, hier ist meine Version (Gimmick: Gibt eine für Menschen lesbare formatierte Größe zurück ;-)):
Inhalt: https://gist.github.com/eyecatchup/f26300ffd7e50a92bc4d (Curl- und get_headers-Version)
get_headers () - Version:
Verwendung:
Zusätzlicher Hinweis: Der Header "Content-Length" ist optional. Daher ist es als allgemeine Lösung nicht kugelsicher !
quelle
Content-Length
ist optional, aber es ist der einzige Weg, die Dateigröße zu erhalten, ohne sie herunterzuladen - undget_headers
der beste Weg, um sie zu erhaltencontent-length
.stream_context_create
diese Option , um einen separaten Kontext für den Aufruf vonget_headers
(7.1+) zu erstellen .Sicher. Stellen Sie eine reine Header-Anfrage und suchen Sie nach dem
Content-Length
Header.quelle
PHP-Funktion
get_headers()
funktioniert für mich, um die Länge des Inhalts als zu überprüfenFür mehr Details: PHP-Funktion get_headers ()
quelle
Ich bin mir nicht sicher, aber konnten Sie die Funktion get_headers dafür nicht verwenden?
quelle
einzeilige beste Lösung:
PHP ist zu delicius
quelle
Die einfachste und effizienteste Implementierung:
quelle
Content-Length
Header enthält . Ein explizites$fp
Schließen ist NICHT NOTWENDIG. Es wird automatisch nach Ablauf freigegeben. php.net/manual/en/language.types.resource.phpnc -l localhost 8080
*close
Funktionen in modernem PHP nicht erforderlich. Sie haben zwei historische Gründe: Implementierungsbeschränkungen und Nachahmung der C-Sprache.Da diese Frage bereits mit "php" und "curl" gekennzeichnet ist, gehe ich davon aus, dass Sie wissen, wie man Curl in PHP verwendet.
Wenn Sie festlegen, stellen
curl_setopt(CURLOPT_NOBODY, TRUE)
Sie eine HEAD-Anfrage und können wahrscheinlich den Header "Content-Length" der Antwort überprüfen, bei dem es sich nur um Header handelt.quelle
Versuchen Sie die folgende Funktion, um die Größe der Remote-Datei zu ermitteln
quelle
Hier ist ein weiterer Ansatz, der mit Servern funktioniert, die keine
HEAD
Anforderungen unterstützen.Es verwendet cURL, um eine Anforderung für den Inhalt mit einem HTTP-Bereichskopf zu stellen, der nach dem ersten Byte der Datei fragt.
Wenn der Server Bereichsanforderungen unterstützt (die meisten Medienserver werden dies tun), erhält er die Antwort mit der Größe der Ressource.
Wenn der Server nicht mit einem Bytebereich antwortet, sucht er nach einem Header mit Inhaltslänge, um die Länge zu bestimmen.
Wenn die Größe in einem Header für einen Bereich oder eine Inhaltslänge gefunden wird, wird die Übertragung abgebrochen. Wird die Größe nicht gefunden und die Funktion beginnt mit dem Lesen des Antwortkörpers, wird die Übertragung abgebrochen.
Dies kann ein zusätzlicher Ansatz sein, wenn eine
HEAD
Anforderung zu einer405
nicht unterstützten Antwort führt.Verwendung:
quelle
Content-Length
nicht verfügbar ist.Die meisten Antworten hier verwenden entweder CURL oder basieren auf dem Lesen von Headern. In bestimmten Situationen können Sie jedoch eine viel einfachere Lösung verwenden. Beachten Sie den Hinweis zu
filesize()
den Dokumenten auf PHP.net . Dort finden Sie einen Tipp: " Ab PHP 5.0.0 kann diese Funktion auch mit einigen URL-Wrappern verwendet werden. Informationen zu den Wrappern, die die stat () -Familie von Funktionen unterstützen, finden Sie unter Unterstützte Protokolle und Wrapper ."Wenn Ihr Server und Ihr PHP-Parser richtig konfiguriert sind, können Sie einfach die
filesize()
Funktion verwenden, sie mit der vollständigen URL versorgen, auf eine entfernte Datei zeigen, welche Größe Sie erhalten möchten, und PHP die ganze Magie machen lassen.quelle
Versuchen Sie Folgendes: Ich benutze es und habe ein gutes Ergebnis erzielt.
Testen Sie nun wie folgt:
Ergebnisse:
24,82 KiB
912 KiB
101,85 KiB
quelle
Um die HTTP / 2-Anforderung abzudecken, muss die hier bereitgestellte Funktion https://stackoverflow.com/a/2602624/2380767 ein wenig geändert werden:
quelle