No se puede obtener el nombre de archivo remoto en file_get_contents () y luego almacenar el archivo

Quiero descargar un archivo remoto y ponerlo en el directorio de mi servidor con el mismo nombre que tiene el original. Traté de usar file_get_contents($url) .

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.

Lo solucioné de otra manera. Descubrí que si no hay disposición de contenido en los encabezados de url, el nombre de archivo existe en la 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! 🙂

Basado en el código de Peter222, escribí una función para obtener el nombre del archivo. Puede usar 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 se completará con file_get_contents ())

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

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 llama a file_get_contents() en una página web eliminada ( example.com/foobar.php ), no se le presentará 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 de archivo no está presente en la URL y no hay forma de que pueda obtenerlo desde ningún lugar, entonces se encuentra en un callejón sin salida. Los datos no pueden ser simplemente invocados desde el campo trascendental del dato.

Para soluciones alternativas, solo puedo sugerir el uso de la biblioteca cURL (se usa para manejar consultas desde su servidor (como si fuera un cliente) a otros servidores que usan URL, de ahí el nombre de URL ) o los sockets de archivos . Aquí está la respuesta de otra pregunta sobre Stack Overflow que describe cómo recuperar el nombre de archivo usando cURL .

Además, puede tratar de 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 archivo y otros metadatos.