2009-09-09 8 views

Respuesta

8

Sí. Como el archivo es remoto, depende completamente del valor del encabezado Content-Length (a menos que desee descargar todo el archivo). Querrá curl_setopt($ch, CURLOPT_NOBODY, true) y curl_setopt($ch, CURLOPT_HEADER, true).

10

Supongo que usar curl para enviar una solicitud HEAD es una buena posibilidad; algo como esto probablemente haría:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://sstatic.net/so/img/logo.png'); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_exec($ch); 
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); 
var_dump($size); 

Y le conseguirá:

float 3438 

De esta manera, está utilizando una petición HEAD, y no descargar todo el archivo - todavía, que dependen de la servidor remoto envía un encabezado Content-length correcto.


Otra opción que se podría pensar acerca sería utilizar filesize ... Pero esta fallará: la documentación indica (citando):

A partir de PHP 5.0.0, esta la función puede también se puede usar con algunas envolturas de URL. Consulte List of Supported Protocols/Wrappers para obtener una lista de de los cuales los envoltorios admiten la familia de funcionalidad stat() .

Y, por desgracia, con HTTP and HTTPS wrappers, stat() No se admite ...

Si intenta, obtendrá un error, así:

Warning: filesize() [function.filesize]: stat failed 
    for http://sstatic.net/so/img/logo.png 

Lástima :-(

1

El uso de una solicitud HEAD y la comprobación de Content-Length es la forma estándar de hacerlo, pero no puede confiar en ello en general, ya que el servidor podría no ser compatible con este.El encabezadoes opcional, y además el servidor podría incluso no implementar el método HEAD. Si sabe qué servidor está probando, puede probar si funciona, pero como solución general no es a prueba de balas.

+0

sí, con esto: http: // php. net/manual/es/function.get-headers.php – Merlinox

1

Si usted no necesita una solución a prueba de balas puede simplemente hacer:

strlen(file_get_contents($url)); 
+4

Esto funcionará, pero también descargará el archivo primero. Presumiblemente, él quiere saber el tamaño antes de ir a buscarlo a través de la red. – troelskn

49

La mejor solución que sigue el principio KISS

$head = array_change_key_case(get_headers("http://example.com/file.ext", TRUE)); 
$filesize = $head['content-length']; 
+8

De lejos, la mejor respuesta. Bien hecho. –

+2

Este comando no devuelve una clave 'content-length' para mí, aquí está la matriz que devuelve: ''connection' => string 'close' (longitud = 5) 'date' => string 'Tue, 03 jun. 2014 20:55:55 GMT '(longitud = 29) ' servidor '=> cadena' Microsoft-IIS/6.0 '(longitud = 17) ' x-powered-by '=> cadena' ASP.NET '(longitud = 7) ' x-aspnet-version '=> cadena' 4.0.30319 '(longitud = 9) ' cache-control '=> cadena' privada '(longitud = 7) ' content-type ' '=> string' image/gif'' –

+2

Pregunta rápida, ¿por qué necesita array_change_key_case? – mario

Cuestiones relacionadas