2012-08-07 18 views
5

Desidero scaricare un file remoto e inserirlo nella directory del server con lo stesso nome dell'originale. Ho provato a usare file_get_contents($url).Impossibile recuperare il nome file remoto in file_get_contents() e quindi archiviare il file

Il problema è che il nome file non è incluso in $url, è come: www.domain.com?download=1726. Questo URL mi dà, ad esempio: myfile.exe, quindi voglio usare file_put_contents('mydir/myfile.exe');.

Come posso recuperare il nome file? Ho provato get_headers() prima di scaricare, ma ho solo la dimensione del file, la data di modifica e altre informazioni, manca il nome del file.

+0

Dai un'occhiata alla CURL dovrebbe coprire quello che vi serve http: // php.net/manual/en/book.curl.php – Waygood

+0

Guarda questa domanda per il nome file cURL http://stackoverflow.com/questions/1750055/with-php-curl-get-filename-from-file-header – Waygood

risposta

0

file_get_contents() tramite il wrapper HTTP non scarica direttamente il file se il file è stato pre-analizzato dal server web.

Prendiamo il seguente esempio: se si chiama file_get_contents() su una pagina web remove (example.com/foobar.php), non verrà presentato con il codice sorgente di di foobar.php, ma come il server web di example.com analizza il file PHP. Quindi sarai in grado di recuperare l'output HTML generato.

Se il nome file non è presente nell'URL e non è possibile recuperarlo da nessuna parte, ci si trova in un vicolo cieco. I dati non possono essere solo convocati dal dal campo trascendentale del dato.

di soluzioni alternative, posso suggerire utilizzando la libreria cURL (che viene usato per gestire le query dal server (come si trattasse di un client) ad altri server con l'utilizzo di URL, da cui il nome ciente URL) solo o file sockets . Ecco another question's answer on Stack Overflow che descrive come recuperare il nome file utilizzando cURL.

Inoltre, potresti provare a contattare il team di amministratore/manutentore/webmaster di domain.com, chiedendo se avevano un'API pubblicamente disponibile per recuperare i nomi di file e altri metadati.

+0

Grazie Per una rapida risposta Proverò cURL. Ma mi chiedo ancora, come il browser conosce esattamente il nome del file? Quando inserisco questo URL nel browser, ottengo una finestra di salvataggio rapida con un vero nome file. Quindi, quando uso prima: ini_set ('user_agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv: 1.9.0.16) Gecko/2009121601 Ubuntu/9.04 (scherzoso) Firefox/3.0.16'); Pensavo di essere come un browser :) – Peter222

+0

[RFC 2183] (http://www.ietf.org/rfc/rfc2183.txt) descrive l'intestazione 'Content-Disposition:' e che è in grado di contenere una direttiva 'filename'. I browser analizzano questa parte dell'intestazione e recuperano vari metadati da essa. Controlla la risposta che ho collegato come correlato nella mia risposta, descrive un metodo come si può recuperare questa intestazione usando PHP (e cURL). – Whisperity

+0

Ho testato tutti gli esempi sopra. Nessun successo. Ho provato questa classe di esempio completa: http://stackoverflow.com/questions/6177661/how-do-download-a-file-with-curl ma non posso ottenere il nome file originale da cURL. Anche se il nome file è incluso nell'URL. Qualcuno potrebbe mettere un esempio funzionante basato su qualsiasi file pubblico (jpg o qualcosa del genere). Basta scaricare il telecomando e salvare localmente con lo stesso nome. Saró molto grato. Googling 2 giorni, nessuna idea :( – Peter222

7

L'ho risolto in un altro modo. Ho trovato che se non ci sono contenuto-disposizione nelle intestazioni di URL, quindi il nome del file esiste nell'URL. Quindi, questo codice funziona con qualsiasi tipo di URL (senza riccioli necessario):

$url = "http://www.example.com/download.php?id=123"; 
// $url = "http://www.example.com/myfile.exe?par1=xxx"; 
$content = get_headers($url,1); 
$content = array_change_key_case($content, CASE_LOWER); 

    // by header 
if ($content['content-disposition']) { 
    $tmp_name = explode('=', $content['content-disposition']); 
    if ($tmp_name[1]) $realfilename = trim($tmp_name[1],'";\''); 
} else 

// by URL Basename 
{ 
    $stripped_url = preg_replace('/\\?.*/', '', $url); 
    $realfilename = basename($stripped_url); 

} 

funziona! :)

+0

+1 .È molto utile, ma perché non lo accetti come risposta? C'è un problema con questo codice? – aliqandil

5

In base al codice di Peter222 ho scritto una funzione per ottenere il nome file. È possibile utilizzare la variabile $ http_response_header:

function get_real_filename($headers,$url) 
{ 
    foreach($headers as $header) 
    { 
     if (strpos(strtolower($header),'content-disposition') !== false) 
     { 
      $tmp_name = explode('=', $header); 
      if ($tmp_name[1]) return trim($tmp_name[1],'";\''); 
     } 
    } 

    $stripped_url = preg_replace('/\\?.*/', '', $url); 
    return basename($stripped_url); 
} 

Usage: ($ http_response_header saranno riempiti da file_get_contents())

$url = 'http://example.com/test.zip'; 
$myfile = file_get_contents($url); 
$filename = get_real_filename($http_response_header,$url) 
Problemi correlati