Não é possível obter o nome do arquivo remoto para file_get_contents () e, em seguida, armazenar o arquivo

Quero baixar um arquivo remoto e colocá-lo no meu diretório do servidor com o mesmo nome que o original. Eu tentei usar file_get_contents($url) .

O problema é que o nome do arquivo não está incluído em $url , é como: www.domain.com?download=1726 . Este URL me dá, por exemplo: myfile.exe , então eu quero usar file_put_contents('mydir/myfile.exe'); .

Como eu poderia recuperar o nome do arquivo? Eu tentei get_headers() antes do download, mas eu só tenho tamanho de arquivo, data de modificação e outras informações, o nome do arquivo está faltando.

Resolvi de outra maneira. Eu descobri que, se não houver disposição de conteúdo em headers url, então o nome do arquivo existe no URL. Então, esse código funciona com qualquer tipo de URL (não é necessário o 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! 🙂

Com base no código de Peter222, escrevi uma function para obter o nome do arquivo. Você pode usar a variável $ 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á preenchido por 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 o wrapper HTTP não baixa diretamente o arquivo se o arquivo tiver sido previamente analisado pelo servidor web.

Tome o seguinte exemplo: se você chamar file_get_contents() em uma página de remoção ( example.com/foobar.php ), você não receberá o código-fonte do foobar.php , mas como o servidor web do example.com analisa o Arquivo PHP. Então, você só poderá recuperar a saída HTML gerada.

Se o nome do arquivo não estiver presente no URL e não há nenhuma maneira que você possa buscá-lo em qualquer lugar, então você está em um beco sem saída. Os dados não podem ser apenas convocados do campo transcendental do dado.

Para soluções alternativas, eu só posso sugerir o uso da biblioteca cURL (é usado para lidar com consultas do servidor (como era um cliente) para outros servidores usando o URL, daí o nome do URL do usuário) ou os sockets de arquivo . Aqui está a resposta de outra pergunta sobre o estouro de pilha, que descreve como obter o nome do arquivo usando o cURL .

Além disso, você pode tentar entrar em contato com o administrador / mantenedor / equipe de webmaster do domain.com , perguntando se eles tinham uma API disponível publicamente para buscar nomes de arquivos e outros metadados.