PHP fopen()在HTTP上,如何检查是否存在及其MIME?
我正在尝试从我的脚本远程解析CSV。我用PHP fopen()在HTTP上,如何检查是否存在及其MIME?,php,file,csv,mime-types,fopen,Php,File,Csv,Mime Types,Fopen,我正在尝试从我的脚本远程解析CSV。我用fopen()打开它,然后用fgetcsv解析数据。我需要检查文件是否确实存在。这将不起作用,始终返回true: $response->setStatusCode(500); $response->setContent($url); if (($handle = fopen($url, "r")) == FALSE) return $response; 问题是,即使资源不存在,我的ISP也会将我重定向到它的搜索页面(我
fopen()
打开它,然后用fgetcsv
解析数据。我需要检查文件是否确实存在。这将不起作用,始终返回true
:
$response->setStatusCode(500);
$response->setContent($url);
if (($handle = fopen($url, "r")) == FALSE) return $response;
问题是,即使资源不存在,我的ISP也会将我重定向到它的搜索页面(我在本地开发)
如果可能的话,只需检查url的MIME即可。有什么帮助吗?在本地计算机网络配置中设置其他DNS服务器。例如,您可以使用谷歌DNS服务器()。解决方案:禁用重定向。通常,这涉及到将DNS服务器更改为非ISP管理的服务器 解决方法:对
fopen()
返回的资源调用()
。对于http:
协议,返回的数组将有一个wrapper\u data
项,其中包含所有http响应头。请注意,如果涉及重定向,则所有响应都将位于同一数组中,如下例所示
$ php -r '$a = fopen("http://www.google.com/", "r"); print_r(stream_get_meta_data($a));'
Array
(
[wrapper_data] => Array
(
[0] => HTTP/1.0 302 Found
[1] => Location: http://www.google.co.uk/
[2] => Cache-Control: private
[3] => Content-Type: text/html; charset=UTF-8
[4] => Set-Cookie: PREF=ID=5e6e2f87c95ce139:FF=0:TM=1317669253:LM=1317669253:S=uaGlatRCh9XB8oAI; expires=Wed, 02-Oct-2013 19:14:13 GMT; path=/; domain=.google.com
[5] => Date: Mon, 03 Oct 2011 19:14:13 GMT
[6] => Server: gws
[7] => Content-Length: 221
[8] => X-XSS-Protection: 1; mode=block
[9] => HTTP/1.0 200 OK
[10] => Date: Mon, 03 Oct 2011 19:14:13 GMT
[11] => Expires: -1
[12] => Cache-Control: private, max-age=0
[13] => Content-Type: text/html; charset=ISO-8859-1
[14] => Set-Cookie: PREF=ID=9c5c0212c24c4ca1:FF=0:TM=1317669253:LM=1317669254:S=P7nzy5lBsmvuZm8A; expires=Wed, 02-Oct-2013 19:14:14 GMT; path=/; domain=.google.co.uk
[15] => Set-Cookie: NID=51=J8T2rxPOdsbfWlIWhWIdL4uerFqLibBV2LDh81OdqmfvRvq3zXwAJ7tsNEmBby_h2wT4Qv8Wd7QK6CyG-leo9mgR4RbFeNpw83mMGlvCHhU0uiUv6ki2doinv1EBU5XM; expires=Tue, 03-Apr-2012 19:14:14 GMT; path=/; domain=.google.co.uk; HttpOnly
[16] => Server: gws
[17] => X-XSS-Protection: 1; mode=block
)
[wrapper_type] => http
[stream_type] => tcp_socket/ssl
[mode] => r
[unread_bytes] => 4096
[seekable] =>
[uri] => http://www.google.com/
[timed_out] =>
[blocked] => 1
[eof] =>
)
$php-r'$a=fopen(“http://www.google.com/“,“r”);打印(流获取元数据($a));'
排列
(
[wrapper_data]=>数组
(
[0]=>找到HTTP/1.0 302
[1] =>位置:http://www.google.co.uk/
[2] =>缓存控制:专用
[3] =>内容类型:文本/html;字符集=UTF-8
[4] =>设置Cookie:PREF=ID=5e6e2f87c95ce139:FF=0:TM=1317669253:LM=1317669253:S=uaGlatRCh9XB8oAI;expires=Wed,2013年10月2日19:14:13 GMT;路径=/;域=.google.com
[5] =>日期:2011年10月3日星期一19:14:13 GMT
[6] =>服务器:gws
[7] =>内容长度:221
[8] =>X-XSS-保护:1;模式=块
[9] =>HTTP/1.0 200正常
[10] =>日期:2011年10月3日星期一19:14:13 GMT
[11] =>过期:-1
[12] =>缓存控制:专用,最大年龄=0
[13] =>内容类型:文本/html;字符集=ISO-8859-1
[14] =>设置Cookie:PREF=ID=9c5c0212c24c4ca1:FF=0:TM=1317669253:LM=1317669254:S=P7nzy5lBsmvuZm8A;expires=Wed,02-Oct-2013 19:14:14 GMT;path=/;domain=.google.co.uk
[15] =>设置Cookie:NID=51=J8T2rxPOdsbfWlIWhWIdL4uerFqLibBV2LDh81OdqmfvRvq3zXwAJ7tsNEmBby\uH2wt4qv8wd7qk6cyg-leo9mgR4RbFeNpw83mMGlvCHhU0uiUv6ki2doinv1EBU5XM;expires=2012年4月3日星期二19:14:14 GMT;path=/;domain=.google.co.uk;HttpOnly
[16] =>服务器:gws
[17] =>X-XSS-保护:1;模式=块
)
[包装器类型]=>http
[流\u类型]=>tcp\u套接字/ssl
[模式]=>r
[未读字节]=>4096
[可搜索]=>
[uri]=>http://www.google.com/
[超时]=>
[被阻止]=>1
[eof]=>
)
试着提出一个头部的请求。您应该能够从那里的状态代码中查看资源是否可用。尝试使用
get\u headers
::发出一个HEAD请求。您应该能够从那里的状态代码中查看资源是否可用。请尝试此->如果($handle=fopen($url,“r”)!==FALSE)返回$response@这听起来是个不错的解决方案,它返回302!谢谢我会把它标记为一个答案。获取URI,然后检查它的结尾->example.com/file.csv->$file=$\u SERVER['REQUEST\u URI'];回声系统(“文件-i-b”。$file)@格雷莫:补充回答:)我已经在使用谷歌dns服务器(8.8.8.8),但出于某种奇怪的原因,我仍然看到ISP搜索页面。有线索吗?。。。和交换ISP。一个做dns重定向的ISP,没有办法选择退出,应该破产。@Gremo:很可能是深度数据包检查。@MarcB是的,我知道,这是一件坏事。但现在我必须关注这个问题,而不是改变ISP:)这种方法很简单,而且可以很好地检查状态和内容类型。谢谢