PHP fopen()在HTTP上,如何检查是否存在及其MIME?

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也会将我重定向到它的搜索页面(我

我正在尝试从我的脚本远程解析CSV。我用
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:)这种方法很简单,而且可以很好地检查状态和内容类型。谢谢