Remote-Dateigröße ohne Herunterladen der Datei

Lesezeit: 6 Minuten

Remote Dateigrose ohne Herunterladen der Datei
dassouki

Gibt es eine Möglichkeit, die Größe einer Remote-Datei zu ermitteln? http://meine_url/meine_datei.txt ohne die Datei herunterzuladen?

Remote Dateigrose ohne Herunterladen der Datei
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_getinfowie @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

1646961247 792 Remote Dateigrose ohne Herunterladen der Datei
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 hat get_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 – und get_headers ist der beste Weg zu bekommen content-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 erstellen get_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

1646961248 793 Remote Dateigrose ohne Herunterladen der Datei
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");

1646961248 247 Remote Dateigrose ohne Herunterladen der Datei
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

989480cookie-checkRemote-Dateigröße ohne Herunterladen der Datei

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy