2012-08-07 13 views
5

Quiero descargar un archivo remoto y ponerlo en el directorio de mi servidor con el mismo nombre que el original. Traté de usar file_get_contents($url).No se puede obtener el nombre de archivo remoto en file_get_contents() y luego almacenar el archivo

El problema es que el nombre de archivo no está incluido en $url, es como: www.domain.com?download=1726. Esta URL me da, por ejemplo, myfile.exe, así que quiero usar file_put_contents('mydir/myfile.exe');.

¿Cómo podría recuperar el nombre del archivo? Intenté get_headers() antes de descargar, pero solo tengo el tamaño del archivo, la fecha de modificación y otra información, falta el nombre del archivo.

+0

Tenga una mirada en la encrespa debe cubrir lo que necesita http: // php.net/manual/en/book.curl.php – Waygood

+0

Mire esta pregunta para cURL nombre de archivo http://stackoverflow.com/questions/1750055/with-php-curl-get-filename-from-file-header – Waygood

Respuesta

0

file_get_contents() sobre el contenedor HTTP no descarga directamente el archivo si el servidor web lo ha analizado previamente.

Tome el siguiente ejemplo: si se llama file_get_contents() en una página web remove (example.com/foobar.php), no se le presentará con el código fuente de foobar.php, pero cómo el servidor web de example.com analiza el archivo PHP. Por lo tanto, solo podrá recuperar el resultado HTML generado.

Si el nombre del archivo no está presente en la URL y no hay forma de que pueda buscarlo desde ningún lugar, entonces se encuentra en un callejón sin salida. Los datos no pueden ser solo convocados desde el campo de referencia trascendental.

Para soluciones alternativas, sólo puedo sugerir el uso de la biblioteca cURL (Se utiliza para controlar las consultas de su servidor (como se tratara de un cliente) a otros servidores con el uso de URL, por lo tanto, la URL ciente nombre ) o file sockets . Aquí está another question's answer on Stack Overflow que describe cómo recuperar el nombre de archivo usando cURL.

Además, puede intentar ponerse en contacto con el equipo de administrador/mantenedor/webmaster de domain.com, preguntando si tenían una API disponible públicamente para buscar nombres de archivos y otros metadatos.

+0

Gracias Usted para una respuesta rápida. Voy a intentar cURL. Pero todavía me pregunto, ¿cómo el navegador sabe exactamente el nombre del archivo? Cuando pongo esta url en el navegador, obtengo una ventana rápida para guardar con un nombre de archivo real. Entonces, cuando uso antes: ini_set ('user_agent', 'Mozilla/5.0 (X11; U; Linux i686; es-US; rv: 1.9.0.16) Gecko/2009121601 Ubuntu/9.04 (jaunty) Firefox/3.0.dieciséis'); Pensé que soy como un navegador :) – Peter222

+0

[RFC 2183] (http://www.ietf.org/rfc/rfc2183.txt) describe el encabezado 'Content-Disposition:' y que es capaz de contener una directiva 'filename'. Los navegadores analizan esta parte del encabezado y obtienen varios metadatos de ella. Verifique la respuesta que he vinculado según lo relacionado en mi respuesta, describe un método de cómo se puede recuperar este encabezado usando PHP (y cURL). – Whisperity

+0

He probado todos los ejemplos anteriores. Sin éxito. Intenté completar esta clase de ejemplo: http://stackoverflow.com/questions/6177661/how-do-download-a-file-with-curl pero no puedo obtener el nombre original por cURL. Incluso si el nombre del archivo está incluido en la URL. ¿Podría alguien poner ejemplo de trabajo basado en cualquier archivo público (jpg o algo así)? Simplemente descarga el control remoto y guarda localmente con el mismo nombre. Estaré muy agradecido. Google en 2 días, sin ideas :( – Peter222

7

Lo resolví de otra manera. Encontré que si no hay content-disposition en los encabezados de url, entonces el nombre de archivo existe en URL. Por lo tanto, este código funciona con cualquier tipo de URL (no se necesita cURL):

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

} 

¡Funciona! :)

+0

+1. Es muy útil, pero ¿por qué no lo acepta como la respuesta? ¿Hay algún problema con este código? – aliqandil

5

Basado en el código de Peter222 escribí una función para obtener el nombre del archivo. Puede utilizar la variable $ 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); 
} 

Uso: ($ http_response_header será ocupado por file_get_contents())

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