我想下载一个远程文件并将其放在我的服务器目录中,其名称与原始文件的名称相同。我尝试使用file_get_contents($url)
。
问题是文件名不包含在$url
中,就像:www.domain.com?download=1726
。这个网址给我,例如:myfile.exe
,所以我想使用file_put_contents('mydir/myfile.exe');
。
我如何检索文件名?我在下载前尝试get_headers()
,但我只有文件大小,修改日期和其他信息,文件名丢失。
答案 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)
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来获取文件名和其他元数据。