2011-10-07 14 views
27

Ho bisogno di verificare se un file particolare esiste su un server remoto. L'utilizzo di is_file() e file_exists() non funziona. Qualche idea su come farlo in modo rapido e semplice?Come verificare se un file esiste da un url

+0

perché non lavorare ??? – JellyBelly

+3

È possibile utilizzare questa funzione getimagesize ("url"); . Rif: http://php.net/manual/en/function.getimagesize.php – InventorX

risposta

49

è necessario utilizzare CURL

function is_url_exist($url){ 
    $ch = curl_init($url);  
    curl_setopt($ch, CURLOPT_NOBODY, true); 
    curl_exec($ch); 
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

    if($code == 200){ 
     $status = true; 
    }else{ 
     $status = false; 
    } 
    curl_close($ch); 
    return $status; 
} 
+1

funziona bene hai una riga di battitura 1 functon dovrebbe essere la funzione –

+0

Non hai bisogno di CURL per quello ... troppo troppo alto ... controlla la mia risposta qui sotto (usa get_header di PHP per questo!) – patrick

+1

come gli altri è troppo, non controllando se si tratta di un file o meno, basta controllare l'URL. 'echo is_url_exists ('http://stackoverflow.com')? 'Sì': 'No'; 'echo' Sì. –

1

Fare una richiesta con arricciatura e vedere se restituisce un codice di stato 404. Esegui la richiesta utilizzando il metodo di richiesta HEAD in modo che restituisca solo le intestazioni senza corpo.

13

ho appena trovato questa soluzione:

if(@getimagesize($remoteImageURL)){ 
    //image exists! 
}else{ 
    //image does not exist. 
} 

Fonte: http://www.dreamincode.net/forums/topic/11197-checking-if-file-exists-on-remote-server/

+0

Intendevi 'getimagesize'? Come qui: http://uk1.php.net/getimagesize se è così allora i documenti dicono che può fare riferimento a file locali o remoti. – Todd

+0

Sì, corretto. Grazie! –

+2

getimagesize è troppo sovraccarico. Se vuoi solo sapere se esiste un file usa get_header di PHP (controlla la mia risposta) – patrick

45

Non hanno bisogno CURL per questo ... Troppo molto overhead per il solo voler verificare se un file esiste o no ...

Utilizzare PHP's get_header.

$headers=get_headers($url); 

Poi controlla se $ risultato [0] contiene 200 OK (il che significa che il file è lì)

Una funzione per controllare se funziona un URL potrebbe essere questo:

function UR_exists($url){ 
    $headers=get_headers($url); 
    return stripos($headers[0],"200 OK")?true:false; 
} 

/* You can test a URL like this (sample) */ 
if(UR_exists("http://www.amazingjokes.com/")) 
    echo "This page exists"; 
else 
    echo "This page does not exist"; 
+1

' Per impostazione predefinita get_headers usa una richiesta GET per recuperare le intestazioni' - quindi invece del sovraccarico di una richiesta di ricciolo (non proprio sicuro di quale overhead ci si stia riferendo) - c'è una richiesta GET dispendiosa che fa cadere il corpo - invece di usare una richiesta HEAD e solo ricevere le intestazioni. – AD7six

+1

@ AD7six: stavo dando per scontato che l'impostazione di cURL in memoria causerebbe un sovraccarico, ho fatto alcuni test confrontando i due metodi e hai ragione: se hai caricato la libreria cURL è sempre più veloce usare il metodo accettato rispetto a get_headers. Ho confrontato tutti e 3 i metodi citati: cURL è il più veloce, quindi get_headers, quindi getimagesize con il lato negativo getimagesize aggiunto ti dirà solo se esiste un'immagine. È quello che è stato chiesto, quindi è ancora una risposta valida qui, ma non è molto versatile. – patrick

+1

@ ad7six sei sicuro che get_headers sta richiedendo il corpo? fyi, puoi sovrascrivere la richiesta GET tramite il contesto dello stream: stream_context_set_default (['http' => ['method' => 'HEAD']]); $ intestazioni = get_headers ('http://example.com'); – Tobias

3

Hi secondo il nostro test tra 2 server diversi i risultati sono i seguenti:

utilizzando curl per il controllo di 10 file .png (ciascuno di circa 5 mb) era in media 5,7 secondi. utilizzando la verifica dell'intestazione per la stessa cosa è durato in media 7,8 secondi!

Quindi nel nostro test curl è stato molto più veloce se si devono controllare file più grandi!

la nostra funzione ricciolo è:

function remote_file_exists($url){ 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_NOBODY, true); 
    curl_exec($ch); 
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    curl_close($ch); 
    if($httpCode == 200){return true;} 
    return false; 
} 

qui è il nostro colpo di testa del campione di controllo:

function UR_exists($url){ 
    $headers=get_headers($url); 
    return stripos($headers[0],"200 OK")?true:false; 
} 
Problemi correlati