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

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()在下载之前尝试过,但我只有文件大小,修改日期和其他信息,缺少文件名.

Pet*_*222 7

我用另一种方式解决了.我发现如果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)

有用!:)


Nik*_*sac 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);
}
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)


Whi*_*ity 0

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 来获取文件名和其他元数据。