无法获取远程文件名的file_get_contents(),然后存储文件(Can't get

2019-07-30 20:18发布

我想下载远程文件,并把它放在我的服务器目录与原件具有相同的名称。 我试图用file_get_contents($url)

问题是,文件名不包含在$url ,它是这样的: www.domain.com?download=1726 。 这个网址给我,例如: myfile.exe ,因此我想用file_put_contents('mydir/myfile.exe');

我怎么能检索的文件名? 我试图get_headers()下载之前,但我只有文件的大小,修改日期等信息,文件名丢失。

Answer 1:

我解决了它的另一种方式。 我发现,如果没有内容部署在URL头,然后在文件名存在的URL。 因此,该代码可以使用任何类型的URL(无卷曲需要)的:

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

} 

有用! :)



Answer 2:

基于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)


Answer 3:

file_get_contents()在HTTP包装不直接下载该文件,如果文件已经通过服务器预分析。

看看下面的例子:如果你调用file_get_contents()在删除网页( example.com/foobar.php ),你将不会被源代码提交foobar.php ,但Web服务器如何example.com解析PHP文件。 所以,你将只能检索生成的HTML输出。

如果文件名是不存在的网址,也没有办法,你可以从任何地方获取它,那么你是在一个死胡同。 数据不能只是从数据的验领域传唤

对于替代解决方案,我只能建议使用cURL库(它是用来从你的服务器处理查询(因为它是一个客户端)到其他服务器上使用URL,故名cient URL)或文件的插座 。 这是另一个问题的堆栈溢出的答案 ,它描述了如何使用获取文件名cURL

此外,您可能尝试获得与管理员/维护/网络管理员队伍触摸domain.com ,询问他们是否有一个公开的API来获取文件名和其他元数据。



文章来源: Can't get remote filename to file_get_contents() and then store file