Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: dimitrix en 19 Marzo 2015, 19:09 pm



Título: Saber lo que pasa un fichero... en internet
Publicado por: dimitrix en 19 Marzo 2015, 19:09 pm
Pues imaginaros que tengo la web:

www.miweb.com

Y quiero saber cuanto pesa el fichero www.google.es/basededatos/backup2014.bak

Sé que se puede saber, pero no sé como sin descargar el fichero ¿Alguien me ayuda?


Título: Re: Saber lo que pasa un fichero... en internet
Publicado por: EFEX en 19 Marzo 2015, 19:38 pm
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13 ?


Título: Re: Saber lo que pasa un fichero... en internet
Publicado por: #!drvy en 19 Marzo 2015, 19:42 pm
Tendrías que mirar el Content-Length que te devuelve el server en los headers.

Código
  1. <?php
  2.  
  3. /**
  4.  * Devolver Content-Length de una url.
  5.  * @param  [string]  $url - URL para request.
  6.  * @return [integer]      - Tamaño en bytes.
  7.  */
  8. function remoteSize($url){
  9.    $head = get_headers($url,true);
  10.    return (isset($head['Content-Length']) ? (int)$head['Content-Length'] : null);
  11. }
  12.  
  13. /* ejemplo - (retorna: 1044381696) */
  14. echo remoteSize('http://releases.ubuntu.com/14.04.2/ubuntu-14.04.2-desktop-amd64.iso');
  15.  
  16. ?>

Aunque supongo que te vendría mejor utilizar curl o algo parecido porque get_headers() esta algo limitado por defecto y algunos servidores te podrían negar la consulta por no tener user-agent por ejemplo.

La idea es obtener los headers y cortar la conexión sin recibir el body.

Saludos


Título: Re: Saber lo que pasa un fichero... en internet
Publicado por: MinusFour en 19 Marzo 2015, 20:26 pm
Tendrías que mirar el Content-Length que te devuelve el server en los headers.

Código
  1. <?php
  2.  
  3. /**
  4.  * Devolver Content-Length de una url.
  5.  * @param  [string]  $url - URL para request.
  6.  * @return [integer]      - Tamaño en bytes.
  7.  */
  8. function remoteSize($url){
  9.    $head = get_headers($url,true);
  10.    return (isset($head['Content-Length']) ? (int)$head['Content-Length'] : null);
  11. }
  12.  
  13. /* ejemplo - (retorna: 1044381696) */
  14. echo remoteSize('http://releases.ubuntu.com/14.04.2/ubuntu-14.04.2-desktop-amd64.iso');
  15.  
  16. ?>

Aunque supongo que te vendría mejor utilizar curl o algo parecido porque get_headers() esta algo limitado por defecto y algunos servidores te podrían negar la consulta por no tener user-agent por ejemplo.

La idea es obtener los headers y cortar la conexión sin recibir el body.

Saludos

Segun la documentacion el metodo por default para get_headers es GET y en este caso lo recomendado seria simplemente usar HEAD. Tienes que usar esto, antes de get_headers();

Código
  1.    array(
  2.        'http' => array(
  3.            'method' => 'HEAD'
  4.        )
  5.    )
  6. );

Tambien lo puedes hacer con curl:

Código
  1. <?php
  2.  
  3. function getContentLength($url){
  4. $curl = curl_init($url);
  5. curl_setopt($curl, CURLOPT_NOBODY, TRUE);
  6. curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
  7. curl_exec($curl);
  8. $contentLength = curl_getinfo($curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
  9. return $contentLength;
  10. }
  11.  
  12. echo getContentLength('http://releases.ubuntu.com/14.04.2/ubuntu-14.04.2-desktop-amd64.iso');
  13. ?>


Título: Re: Saber lo que pasa un fichero... en internet
Publicado por: dimitrix en 24 Marzo 2015, 18:20 pm
Sólo me queda decir "muchas gracias".

Eso sí, una duda más, una vez tengo el número de caracteres ¿Cómo se el tamaño?

Porque la función pone que retorna el número de "bytes" por lo que un carácter es un binario de 8 dígitos, pero... ¿Y si es un UTF-16? Creo que usaba bloques de más de 8 bits por lo que usaría 2 o 4 bytes (según wiki pueden ser 4 :S).