Как проверить, является ли ответ на запрос CURL файлом или HTML / Text, прежде чем сохранять его в переменной? (РНР / локон) - PullRequest
0 голосов
/ 08 июля 2011

Я запрашиваю веб-сайт, такой как (Rapidshare), который в ответ дает мне либо запрошенный файл, либо какой-то HTML-код, говорящий, что мне нужно подождать XX секунд, прежде чем я скачаю файл.Я запутался, как кодировать этот сценарий.

Теперь, если я делаю публикацию с использованием формы HTML, задаю в ней несколько полей и затем автоматически отправляю ее с помощью Javascript на целевой сайт.Если это успешно, пользователю предлагается, если он хочет загрузить это поле, и если это происходит по какой-то причине, например, если пользователю нужно подождать, он переводит пользователя на ЭТОТ сайт URL.

, чтобы избежать перенаправления пользователя на страницу ошибки целевого сайта.Я использую CURL, который отправляет запрос POST и читает ответ.Теперь проблема в том, что если ответом на запрос CURL является файл, страница остается загруженной до тех пор, пока весь файл, полученный в ответе, не будет загружен на сервер и сохранен в этой переменной.

эта функция, выполняющая запрос curl на $ urlс $ headerz в качестве значений заголовка и $ encoded являются параметрами запроса

 function makeCurlPostRequest($url, $headerz, $encoded){
       $ch = curl_init();
       curl_setopt($ch, CURLOPT_URL, $url);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
       if($headerz!=null)
       curl_setopt($ch, CURLOPT_HTTPHEADER, $headerz);
       curl_setopt($ch, CURLOPT_HEADER, 1);
       curl_setopt($ch, CURLOPT_POST, 1);
       if($encoded!=null)
       curl_setopt($ch, CURLOPT_POSTFIELDS, $encoded);
       curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
       curl_setopt($ch, CURLOPT_AUTOREFERER, 0);
       curl_setopt($ch, CURLOPT_REFERER, $url);
       $output = curl_exec($ch);
       curl_close($ch);
       return $output;
    }



 function checkUrl($file,$url,$headerz){
        $post_data = array ( "premium_acc" => "checked",
            "linkx" => "$file"
        );
        $encoded = '';
        foreach($post_data as $name => $value) {
          $encoded .= urlencode($name).'='.urlencode($value).'&';
        }
        $scrapHTML = makeCurlPostRequest($url, $headerz, $encoded);
        return $scrapHTML;
    }

CheckUrl, принимает 3 параметра, $ file link файла для загрузки, $ url url для запроса и $ headerz являются значениями заголовка.

Теперь я загрузил тестовый файл

a.txt

с содержанием

ABCDABCDABCD

Затем, после успешного запроса и печати ответав веб-браузере с использованием ti выводит это

HTTP / 1.1 200 OK Дата: пт, 08 июля 2011 07:25:43 GMT Сервер: Apache / 2.2.16 (Debian) X-Powered-By:PHP / 5.3.3-7 + squeeze1 Срок действия истекает: Пн, 26 Июл 1997, 05:00:00 GMT Последнее изменение: Пт, 08 Июл 2011 07: 25: 43GMT Cache-Control: нет кеша, обязательно повторная проверка Pragma: нет-cache Content-Disposition: filename = "a.txt" Соединение: закрыть Accept-Ranges:bytes Content-Length: 1 Content-Type: application / force-download ABCDABCDABCD

Где ABCDABCDABCD - это содержимое файла TXT.если это аудиофайл, то после полной загрузки он выводит несколько случайных символов.

Мне нужно предложить пользователю загрузить эти данные вместо того, чтобы сначала сохранить их на сервере или в переменной.

Есть ли способ, я могу проверить заголовок ответа, если возвращается файл и если файл, а затем предложить пользователю загрузить.

любое решение с помощью этого метода CURL?

ИЛИ

  <form action="d.php" method="POST">
            <input type="hidden" name ="url" value="<?php echo $url;?>"/>
     <?php 
     foreach($scrapHTML->find('input') as $field) {
      $name = $field->name;
      $value = $field->value;
     ?>       
            <input type="hidden" name ="<?php echo $name;?>" value="<?php echo $value;?>"/>
            <?php
     }
            ?>
        </form>
        <script type="text/javascript">
            void(document.forms[0].submit());
    </script>

Эта HTML-форма отправляет запрос на целевой URL-адрес и в случае успеха запрашивает у пользователя файл для загрузки, но проблема заключается в том, что в случае ошибки пользователь переходит на ЭТОТ веб-сайт об ошибке или на страницу ожидания, которую я не хочу видеть пользователю.

Пожалуйста, предоставьте решение, используя curl или HTML сообщение.

regards, aqif

1 Ответ

0 голосов
/ 08 июля 2011
    $opts = array ( 'http' => array ( 'max_redirects' => 1, 'ignore_errors' => 1 ) );
    stream_context_get_default ( $opts );
    $headers = get_headers ( $url, true );
    if ( strstr ( $headers [ 'Content-Type' ], 'text/html' ) ){
       ....... DO YOUR CODE ..........
    }

РЕДАКТИРОВАТЬ: Установите это для отправки переменных POST

$postdata = http_build_query(
    array(
        'var1' => 'some content',
        'var2' => 'doh'
    )
);
$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded',
        'content' => $postdata
    )
);
   stream_context_get_default ( $opts );
    $headers = get_headers ( $url, true );
    if ( strstr ( $headers [ 'Content-Type' ], 'text/html' ) ){
       ....... DO YOUR CODE ..........
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...