我想下载远程文件,并把它放在我的服务器目录与原件具有相同的名称。 我试图用file_get_contents($url)
。
问题是,文件名不包含在$url
,它是这样的: www.domain.com?download=1726
。 这个网址给我,例如: myfile.exe
,因此我想用file_put_contents('mydir/myfile.exe');
。
我怎么能检索的文件名? 我试图get_headers()
下载之前,但我只有文件的大小,修改日期等信息,文件名丢失。
我解决了它的另一种方式。 我发现,如果没有内容部署在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);
}
有用! :)
基于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)
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来获取文件名和其他元数据。