PHP fopen () через HTTP, как я могу проверить, существует ли и его MIME? - PullRequest
0 голосов
/ 03 октября 2011

Я пытаюсь разобрать CSV удаленно из моего сценария. Я открываю его с помощью fopen(), а затем анализирую данные с помощью fgetcsv. Мне нужно проверить, существует ли файл на самом деле. Это не будет работать, всегда возвращает true:

    $response->setStatusCode(500);
    $response->setContent($url);
    if (($handle = fopen($url, "r")) == FALSE) return $response;

Проблема в том, что даже если ресурс не существует, мой провайдер перенаправит меня на свою страницу поиска (я занимаюсь локальной разработкой).

Будет хорошо просто проверить MIME URL, если это возможно. Любая помощь?

Ответы [ 3 ]

2 голосов
/ 03 октября 2011

Попробуйте сделать просто запрос HEAD с помощью get_headers .Вы должны увидеть, доступен ли ресурс по коду статуса там.

0 голосов
/ 03 октября 2011

Решение: Отключить перенаправление. Обычно это включает в себя замену DNS-серверов на те , а не , управляемые вашим провайдером.

Обходной путь: Вызовите <a href="http://php.net/stream_get_meta_data" rel="nofollow">stream_get_meta_data</a>() на ресурсе, возвращенном fopen(). В случае протокола http: возвращаемый массив будет иметь элемент wrapper_data, содержащий все заголовки ответа HTTP. Обратите внимание, что если задействованы перенаправления, все ответы будут в том же массиве, как в примере ниже.

$ php -r '$a = fopen("http://www.google.com/", "r"); print_r(stream_get_meta_data($a));'
Array
(
<b>    [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
        )
</b>
    [wrapper_type] => http
    [stream_type] => tcp_socket/ssl
    [mode] => r
    [unread_bytes] => 4096
    [seekable] =>
    [uri] => http://www.google.com/
    [timed_out] =>
    [blocked] => 1
    [eof] =>
)
0 голосов
/ 03 октября 2011

Установите другие DNS-серверы в конфигурации вашей локальной сети. Например, вы можете использовать Googles DNS-серверы (http://code.google.com/speed/public-dns).

...