Pet*_*222 5 php header file file-get-contents remote-server
我想下载一个远程文件并将其放在我的服务器目录中,其名称与原始文件的名称相同.我试着用file_get_contents($url).
问题是文件名不包含在内$url,它就像:www.domain.com?download=1726.这个URL给我,例如:myfile.exe,所以我想使用file_put_contents('mydir/myfile.exe');.
我怎么能检索文件名?我get_headers()在下载之前尝试过,但我只有文件大小,修改日期和其他信息,缺少文件名.
我用另一种方式解决了.我发现如果url标头中没有内容处理,则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);
}
Run Code Online (Sandbox Code Playgroud)
有用!:)
基于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);
}
Run Code Online (Sandbox Code Playgroud)
用法:($ 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)
Run Code Online (Sandbox Code Playgroud)
file_get_contents()如果文件已由网络服务器预先解析,则通过 HTTP 包装器不会直接下载该文件。
举个例子:如果你调用file_get_contents()一个删除网页(example.com/foobar.php),你不会看到 的源代码,foobar.php而是看到 的网络服务器如何example.com解析 PHP 文件。因此您只能检索生成的 HTML 输出。
如果 URL 中不存在文件名,并且您无法从任何地方获取它,那么您就陷入了死胡同。数据不能仅仅从数据的先验领域中召唤出来。
对于替代解决方案,我只能建议使用该cURL库(它用于处理从服务器(因为它是客户端)到使用 URL 的其他服务器的查询,因此名称为cient URL)或文件套接字。这是Stack Overflow 上另一个问题的答案,它描述了如何使用cURL.
另外,您可以尝试与 的管理员/维护者/网站管理员团队联系domain.com,询问他们是否有公开可用的 API 来获取文件名和其他元数据。