파일 을 다운로드하지 않고 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 메서드 (!)를 구현하는 것은 아닙니다.
fopen
PHP가있는 경우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");