Cómo obtener un tamaño de archivo del archivo remoto de googlecode con rizo?
Pregunta
Estoy tratando de obtener un tamaño de archivo del archivo remoto "compiler-latest.zip" (googlecode.com) usando cURL sin tener que descargarlo, aquí es mi código PHP:
$url = 'http://closure-compiler.googlecode.com/files/compiler-latest.zip';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // optional
curl_setopt($ch, CURLOPT_MAXREDIRS, 10); // optional
curl_setopt($ch, CURLOPT_TIMEOUT, 60); // optional
$result = curl_exec($ch);
$filesize = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
curl_close($ch);
print 'Filesize: ' . $filesize . '<br><br>';
print_r($result);
Sin embargo, consigo "HTTP / 1.1 404 Not Found" de estado con un tamaño de archivo (1379 bytes) de este documento de error 404. Por lo tanto, si fijo (CURLOPT_NOBODY, 0) se descarga el archivo y devuelve su tamaño de archivo correcto (en la actualidad 3820320 bytes). Mi pregunta es ¿cómo lograr el tamaño de archivo correcto del archivo "compiler-latest.zip" sin necesidad de descargarlo?
IMPORTANTE:. Este código funciona como se esperaba con cualquier otra url fuera del googlecode.com
Solución
Uso get_headers Función:
<?php
$headers = get_headers('http://closure-compiler.googlecode.com/files/compiler-latest.zip');
$content_length = -1;
foreach ($headers as $h)
{
preg_match('/Content-Length: (\d+)/', $h, $m);
if (isset($m[1]))
{
$content_length = (int)$m[1];
break;
}
}
echo $content_length;
Otros consejos
Y cómo obtener un tamaño de archivo, cuando el contenido de longitud falta?