无法获取远程文件名到file_get_contents()然后存储文件

时间:2012-08-07 09:13:15

标签: php file header file-get-contents remote-server

我想下载一个远程文件并将其放在我的服务器目录中,其名称与原始文件的名称相同。我尝试使用file_get_contents($url)

问题是文件名不包含在$url中,就像:www.domain.com?download=1726。这个网址给我,例如:myfile.exe,所以我想使用file_put_contents('mydir/myfile.exe');

我如何检索文件名?我在下载前尝试get_headers(),但我只有文件大小,修改日期和其他信息,文件名丢失。

3 个答案:

答案 0 :(得分:7)

我用另一种方式解决了。我发现如果url标头中没有 content-disposition ,则URL中存在filename。因此,此代码适用于任何类型的URL(无需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);

} 

有效! :)

答案 1 :(得分:5)

基于Peter222的代码我编写了一个获取文件名的函数。 您可以使用$ 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);
}

用法:($ http_response_header将由file_get_contents()填充)

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

答案 2 :(得分:0)

如果文件已经被网络服务器预解析,则HTTP包装器上的

file_get_contents()不直接下载文件。

采用以下示例:如果您在删除网页(file_get_contents())上致电example.com/foobar.php,则不会向您显示{{1}的源代码foobar.php的网络服务器如何解析PHP文件。因此,您只能检索生成的HTML输出。

如果URL中没有文件名,并且您无法从任何地方获取文件名,那么您就处于死路。数据不能只是从基准的超越领域召唤

对于替代解决方案,我只建议使用cURL库(它用于处理来自服务器(因为它是客户端)的查询到使用URL的其他服务器,因此名称​​ cient网址)或file sockets。以下是another question's answer on Stack Overflow,其中介绍了如何使用example.com获取文件名。

此外,您可以尝试与cURL的管理员/维护者/网站管理员团队取得联系,询问他们是否有公开的API来获取文件名和其他元数据。