7

我想下载一个远程文件并将其放在我的服务器目录中,并与原始文件具有相同的名称。我尝试使用file_get_contents($url).

问题是文件名不包含在 中$url,就像:www.domain.com?download=1726. 这个 URL 给我,例如:myfile.exe,所以我想使用file_put_contents('mydir/myfile.exe');.

我怎样才能检索文件名?下载前试过get_headers()了,但是我只有文件大小,修改日期等信息,文件名不见了。

4

3 回答 3

7

我用另一种方式解决了。我发现如果 url 标头中没有content-disposition,则 URL 中存在文件名。因此,此代码适用于任何类型的 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);

} 

有用!:)

于 2012-08-09T22:19:18.417 回答
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)
于 2012-12-09T21:55:29.117 回答
0

file_get_contents()如果文件已被网络服务器预先解析,则通过 HTTP 包装器不会直接下载文件。

个例子:如果你调用一个删除网页file_get_contents()(因此,您将只能检索生成的 HTML 输出。example.com/foobar.phpfoobar.phpexample.com

如果 URL 中不存在文件名,并且您无法从任何地方获取它,那么您就陷入了死胡同。数据不能只是从数据的先验领域中召唤出来。

对于替代解决方案,我只能建议使用cURL库(它用于处理从您的服务器(因为它是客户端)到使用 URL 的其他服务器的查询,因此名称为cient URL)或文件套接字。这是Stack Overflow 上的另一个问题的答案,它描述了如何使用cURL.

此外,您可以尝试与 的管理员/维护者/网站管理员团队取得联系domain.com,询问他们是否有公开可用的 API 来获取文件名和其他元数据。

于 2012-08-07T09:21:56.283 回答