Pregunta

Estaba pensando en hacer una solicitud principal con cURL, ¿me preguntaba si este es el camino a seguir?

¿Fue útil?

Solución

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

Otros consejos

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'];

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 te conseguirá:

float 3438

De esta manera, está utilizando una solicitud HEAD y no está descargando el archivo completo; aún así, depende de que el servidor remoto envíe un encabezado de longitud de contenido correcto.


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

  

A partir de PHP 5.0.0, esta función puede   También se puede utilizar con algunos contenedores de URL.   Consulte Lista de admitidos   Protocolos / Envoltorios para un listado   de los cuales envoltorios soportan stat ()   familia de funcionalidades.

Y, desafortunadamente, con envoltorios HTTP y HTTPS , stat () no es compatible ...

Si lo intentas, obtendrás un error, como este:

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

Lástima :-(

El uso de una solicitud HEAD y la verificación de Content-Length es la forma estándar de hacerlo, pero no puede confiar en él en general, ya que el servidor podría no ser compatible. El encabezado Content-Length es opcional y, además, es posible que el servidor ni siquiera implemente 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.

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

strlen(file_get_contents($url));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top