[php] 파일 다운로드없이 원격 파일 크기

파일 을 다운로드하지 않고 http : //my_url/my_file.txt 원격 파일의 크기를 얻을 수있는 방법이 있습니까?



답변

여기 에 대해 뭔가를 찾았습니다 .

원격 파일의 크기를 가져 오는 가장 좋은 방법은 다음과 같습니다. HEAD 요청은 요청의 실제 본문을 가져 오지 않고 헤더 만 검색합니다. 따라서 100MB의 리소스에 대한 HEAD 요청을 만드는 것은 1KB의 리소스에 대한 HEAD 요청과 동일한 시간이 걸립니다.

<?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;
}
?>

용법:

$file_size = curl_get_file_size( "http://stackoverflow.com/questions/2602612/php-remote-file-size-without-downloading-file" );


답변

이 코드 시도

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;
}


답변

몇 번 언급했듯이 이동 방법 은 응답 헤더의 Content-Length필드 에서 정보를 검색하는 것 입니다 .

그러나

  • 검색중인 서버가 반드시 HEAD 메서드 (!)를 구현하는 것은 아닙니다.
  • fopenPHP가있는 경우 get_headers()(기억 : KISS ) or alike를 사용하거나 심지어 curl 라이브러리를 호출 하기 위해 수동으로 HEAD 요청 (다시 말하지만 지원되지 않을 수도 있음)을 만들 필요가 없습니다 .

의 사용은 get_headers()다음 KISS 원칙 프로빙하고있는 서버가 HEAD 요청을 지원하지 않는 경우에도 작동합니다.

그래서, 여기 내 버전이 있습니다 (gimmick : 사람이 읽을 수있는 형식의 크기를 반환합니다 ;-)) :

요점 : https://gist.github.com/eyecatchup/f26300ffd7e50a92bc4d(curl 및 get_headers 버전)
get_headers ()-버전 :

<?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 <eyecatchup@gmail.com>
 *  @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
}

용법:

$url = 'http://download.tuxfamily.org/notepadplus/6.6.9/npp.6.6.9.Installer.exe';
echo getRemoteFilesize($url); // echoes "7.51 MiB"

추가 참고 사항 : Content-Length 헤더는 선택 사항입니다. 따라서 일반적인 솔루션으로 방탄이 아닙니다 !



답변

확실한. 헤더 만 요청하고 Content-Length헤더를 찾습니다 .


답변

PHP 함수는 get_headers()수표의 나를 위해 작동 내용 길이를

$headers = get_headers('http://example.com/image.jpg', 1);
$filesize = $headers['Content-Length'];

자세한 내용은 PHP 함수 get_headers ()


답변

잘 모르겠지만 get_headers 함수를 사용할 수 없습니까?

$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;


답변

한 줄 최고의 솔루션 :

echo array_change_key_case(get_headers("http://.../file.txt",1))['content-length'];

PHP는 너무 섬세합니다

function urlsize($url):int{
   return array_change_key_case(get_headers($url,1))['content-length'];
}

echo urlsize("http://.../file.txt");