以以下场景为例:
- 用户输入"
http://example.com/index.html
"到我的表单 - 表单被发送到执行
file_get_contents("http://example.com/index.html")
的后端脚本 - PHP脚本将返回的html保存到名为"
site.html
"的文件中(文件扩展名基于给定地址的扩展名)
现在考虑第二个例子:
- 用户输入"
http://example.com
"到我的表单 - 表单被发送到执行
file_get_contents("http://example.com")
的后端脚本PHP脚本将返回的html保存到名为"
site.com
"的文件中(文件扩展名基于给定地址的扩展名)显然这个方法不是理想的,因为文件"site.com"
现在是相当无用的。
我的问题是,有没有一种方法可以让PHP计算出它得到的文件类型?在第二个示例中,根据服务器设置,它可以是"index.html"
到"default.asp"
之间的任何值。
您可以查看Content-Type
HTTP头来找出您正在获得的文件的类型 -但是您无法找出服务器上使用的文件名是什么(或者即使有文件名),并且(在大多数情况下)index.html和default.asp都将返回HTML文档
如果example.com与PHP运行的服务器不同,则不能。选项:你可以蛮力,即尝试不同的可能的文件名(index.htm, index.html, index.php, index.asp, default.html等…)
好吧,不管怎样,它将是HTML文件。所以一定要使用HTML扩展名
这里有两点:
- 首先,如果您只是请求一个目录的根目录,则不可能计算出所服务的文件的名称。这是由web服务器内部处理的,它不会告诉客户端它是如何处理的。对不起。
- 第二-当然你可以给所有的文件一个
.html
扩展名,如果没有指定文件名?在99%的情况下,所提供的默认文件是HTML,即使它是.asp
或.php
扩展,它所输出的都是动态生成的HTML。你不会得到源代码,只会得到结果。
编辑
这是我能想到的最好的解决方案,以确定一个合理的文件扩展名纯粹基于URL:
$urlParts = parse_url($url);
if (!isset($urlParts['path'])) $ext = 'html'; else {
$pathParts = explode('/',$urlParts['path']);
$ext = (count($fileParts = explode('.',array_pop($pathParts))) > 1) ? array_pop($fileParts) : 'html';
}
您不能真正使用URL来确定您得到的响应类型。您需要的是来自Content-Type响应头的MIME类型。
你可以从自动填充的$http_response_header变量中提取这个头。下面的示例将获取URL的内容,并将响应的Content-Type映射到文件扩展名....
$typeMap=array(
'text/html' =>'.html',
'text/plain' =>'.txt',
'image/jpeg' =>'.jpeg',
#you get the idea...
);
$html=file_get_contents("http://www.google.com");
$ext='.html';//assume html, and prove otherwise....
//examine the headers
foreach($http_response_header as $hdr)
{
list($name,$value)=explode(':', $hdr, 2);
if ($name=='Content-Type')
{
#naive parse of content type
list($type,$extra)=explode(';', $value, 2);
if (isset($typeMap[$type]))
$ext=$typeMap[$type];
//no need to look at more headers
break;
}
}