2009-09-09 7 views

risposta

8

Sì. Poiché il file è remoto, sei completamente dipendente dal valore dell'intestazione Content-Length (a meno che non desideri scaricare l'intero file). Ti consigliamo di curl_setopt($ch, CURLOPT_NOBODY, true) e curl_setopt($ch, CURLOPT_HEADER, true).

10

Sto indovinando l'uso di arricciatura per inviare una richiesta HEAD è una buona possibilità; qualcosa di simile sarebbe probabilmente fare:

$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); 

E si arriva:

float 3438 

In questo modo, si sta utilizzando una richiesta HEAD, e non scaricare l'intero file - ancora, si dipendono dal il server remoto invia un'intestazione Content-Length corretta.


Un'altra opzione si potrebbe pensare a sarebbe quella di utilizzare filesize ... Ma questo fallirà: la documentazione afferma (citando):

partire da PHP 5.0.0, questo la funzione può anche essere utilizzata con alcuni wrapper di URL. Fare riferimento a List of Supported Protocols/Wrappers per un elenco di cui i wrapper supportano la famiglia di funzionalità stat() .

E, purtroppo, con HTTP and HTTPS wrappers, stat() non è supportata ...

Se si tenta, si otterrà un errore, in questo modo:

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

Peccato :-(

1

L'utilizzo di una richiesta HEAD e il controllo di Content-Length è il metodo standard per farlo, ma non è possibile fare affidamento su di esso in generale, poiché il server potrebbe non supportarlo. L'intestazioneè facoltativa e inoltre il server potrebbe non implementare nemmeno il metodo HEAD. Se si conosce il server che si sta sondando, è possibile verificare se funziona, ma come soluzione generale non è a prova di proiettile.

+0

sì, con questo: http: // php. net/manual/it/function.get-headers.php – Merlinox

1

Se non avete bisogno di una soluzione a prova di proiettile si può solo fare:

strlen(file_get_contents($url)); 
+4

Funzionerà, ma scaricherà anche il file per primo. Presumibilmente, vuole conoscere la dimensione prima di caricarlo sulla rete. – troelskn

49

La soluzione migliore che segue il principio KISS

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

Di gran lunga la migliore risposta. Ben fatto. –

+2

Questo comando non restituisce una chiave 'content-length' per me, ecco la matrice restituisce: ''connection' => string 'close' (length = 5) 'date' => string 'Tue, 03 giu 2014 20:55:55 GMT '(lunghezza = 29) ' server '=> stringa' Microsoft-IIS/6.0 '(lunghezza = 17) ' x-powered-by '=> stringa' ASP.NET '(lunghezza = 7) ' x-aspnet-version '=> stringa' 4.0.30319 '(lunghezza = 9) ' cache-control '=> stringa' private '(lunghezza = 7) ' tipo-contenuto '=> string' image/gif'' –

+2

Domanda veloce, perché ha bisogno di array_change_key_case? – mario

Problemi correlati