Domanda

Stavo pensando di fare una richiesta principale con CURL, mi chiedevo se questa è la strada da percorrere?

È stato utile?

Soluzione

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) .

Altri suggerimenti

La migliore soluzione che segue il principio KISS

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

Immagino che usare curl per inviare una richiesta HEAD sia una buona possibilità; qualcosa del genere probabilmente farebbe:

$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 ti porterà:

float 3438

In questo modo, stai usando una richiesta HEAD e non stai scaricando l'intero file; tuttavia, dipendi dal server remoto che invia un'intestazione corretta della lunghezza del contenuto.


Un'altra opzione a cui potresti pensare sarebbe quella di utilizzare filesize ... Ma questo fallirà : la documentazione indica (citazione) :

  

A partire da PHP 5.0.0, questa funzione può   può essere utilizzato anche con alcuni wrapper di URL.   Fare riferimento a Elenco dei supportati   Protocolli / wrapper per un elenco   di cui wrapper supportano stat ()   famiglia di funzionalità.

E, sfortunatamente, con wrapper HTTP e HTTPS , stat () non è supportato ...

Se ci provi, otterrai un errore, come questo:

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

Peccato :-(

L'uso di una richiesta HEAD e il controllo di Content-Length è il modo standard per farlo, ma non puoi fare affidamento su di esso in generale, poiché il server potrebbe non supportarlo. L'intestazione Content-Length è facoltativa e inoltre il server potrebbe non implementare nemmeno il metodo HEAD. Se sai quale server stai sondando, puoi verificare se funziona, ma come soluzione generale non è a prova di proiettile.

Se non hai bisogno di una soluzione antiproiettile puoi semplicemente fare:

strlen(file_get_contents($url));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top