获取PHP中URL的文件名

获取PHP中URL的文件名,php,Php,我想从URL获取文件名。但问题是它不会以一个扩展结束 例如。单击此URL,我们将获得一个PDF文件。如何将该文件的文件名存储在变量中?如果有url $url = 'www/htdocs/lib/inc.php' $pathifo = pathinfo($url)// Return Array 当你说$pathinfo['pathinfo\u FILENAME']//如果你发出GET请求http://something.com/1245/65/并返回一个PDF文件,即,Content-Ty

我想从URL获取文件名。但问题是它不会以一个扩展结束

例如。单击此URL,我们将获得一个PDF文件。如何将该文件的文件名存储在变量中?

如果有url

$url = 'www/htdocs/lib/inc.php'

 $pathifo = pathinfo($url)// Return Array 

当你说
$pathinfo['pathinfo\u FILENAME']//如果你发出
GET
请求
http://something.com/1245/65/
并返回一个PDF文件,即,
Content-Type=application/pdf
——您完全无法知道发送给您的
.pdf
文件的实际名称

<?php
  header('Content-Type: text/plain');

  $curl = curl_init('http://localhost/fakefile.php');

  curl_setopt($curl, CURLOPT_HEADER, true);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'HEAD');

  if (($response = curl_exec($curl)) !== false)
  {
    if (curl_getinfo($curl, CURLINFO_HTTP_CODE) == '200')
    {
      var_dump($response);

      $reDispo = '/^Content-Disposition: .*?filename=(?<f>[^\s]+|\x22[^\x22]+\x22)\x3B?.*$/m';
      if (preg_match($reDispo, $response, $mDispo))
      {
        $filename = trim($mDispo['f'],' ";');

        echo "Filename Found: $filename";
      }
    }
  }

  curl_close($curl);
在我处理的web应用程序中,我生成并组合PDF文件,并直接将它们流式传输到浏览器,以响应这样的
GET
请求-甚至不存在实际文件,因此肯定没有文件名


如果你控制着服务器,你可以发明一种将名称传达给请求者的方法,或者如果你想知道的是你的PHP代码(在服务器上运行),你可以提供一些其他的服务器端钩子来查找文件名。

奇怪的是,尝试上面的代码也会让我的Web服务器挂起。我替换了这个代码:

curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'HEAD');
为此:

curl_setopt($ch, CURLOPT_NOBODY, true);

可能会使用类似于cURL的东西来请求HEAD,以查看附件的名称?请在此处输入确切的代码…
$cURL-iv“url”| less
您严格偏离了示例。阅读问题。我不会说绝对没有文件名。这在很大程度上取决于包含的标题。能够指定文件名。此外,如果没有提供,你可以随时编一个(可能是基于时间/日期组合)。说得好@Brad,也许我不应该这么强烈地表达我的答案,但在我的答案中提到的情况下,我实际上位于
内容配置
标题中。我真正想说的是,没有办法真正了解任何给定请求背后的内容,即使对于某些特定情况,它可能是完全可以确定的。最好做strtolower($response),一些服务器可能会设置so@djdance如果您使用*nix或关心文件名的大小写,则不需要。最好在regex模式中指定
i
标志。当然,我在另一台服务器(可能是Windows)上看到了这一点。你能给我举个正则表达式中i标志的例子吗;-)@djdance将
i
附加到
$reDispo
变量。例如,
/…/mi