Как написать PHP скрипт скачивания файла после редиректа?
Имеется сайт. Он отдает файлы вида site.ru/do.php?id=123
Я хочу скачать файл с помощью php.
Пробовал:
@fopen($path, «r»);
file_get_content($path);
а также через cURL.
Когда открывает страницы в браузере начинается скачивание файла. Когда забираешь файл через скрипт, то записывается сама html страничка при открытии которой скачивается файл.
Как я понял идет проверка header, но я передавал параметром через cURL, не получались (ну руки кривые).
Покажите, что не получилось с curl.
Возможно просто Follow_location не поставили.
Чтобы ничего не получалось, такого не бывает.
Это самый простой путь.
Первое. Посмотрите результат экзека.
$content = curl_exec( $ch );
Второе. Посмотрите на информацию типа кода и тд.
$response = curl_getinfo( $ch )
Далее. Не включены cookies
curl_setopt( $ch, CURLOPT_COOKIEJAR, 'cookies.txt');
curl_setopt ($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
Попробуйте не писать в хендл, а возвращать в поток (content) (потом вернёте на хендл).
Обычно после этого понятно, что не так.
И да, рефёрер с протоколом. site.ru/
$content выдает bool(true)
$response выдает { ["url"]=> string(47) "http://site.ru/do.php?id=123" ["content_type"]=> string(31) "text/html; charset=windows-1251" ["http_code"]=> int(404) ["header_size"]=> int(316) ["request_size"]=> int(203) ["filetime"]=> int(-1) ["ssl_verify_result"]=> int(0) ["redirect_count"]=> int(0) ["total_time"]=> float(0.297) ["namelookup_time"]=> float(0) ["connect_time"]=> float(0.078) ["pretransfer_time"]=> float(0.078) ["size_upload"]=> float(0) ["size_download"]=> float(11359) ["speed_download"]=> float(38245) ["speed_upload"]=> float(0) ["download_content_length"]=> float(-1) ["upload_content_length"]=> float(0) ["starttransfer_time"]=> float(0.156) ["redirect_time"]=> float(0) ["certinfo"]=> array(0) { } ["primary_ip"]=> string(12) "ip" ["primary_port"]=> int(80) ["local_ip"]=> string(13) "192.168.0.101" ["local_port"]=> int(62955) ["redirect_url"]=> string(0) "" }
файл создается именно этого размера, но это html с редиректом
реферер я писал с протоколом http.
>Попробуйте не писать в хендл, а возвращать в поток (content) (потом вернёте на хендл).
Это последний вариант я выкладывал. До этого я по-другому передавал. Хотя фраза от моего понимания далека, и я был бы очень благодарен за пояснения.
Скорее всего, вам отдаётся редирект через JS или meta.
Поэтому, убирайте curl_setopt($ch, CURLOPT_FILE, $fp) и в $content будет ваш HTML-ник с редиректом. Задача этот HTML-ник распарсить(т.е вынуть оттуда ссылки и правильным referer перейти по ней)
Самый надежный способ — это посмотреть/записать какие заголовки отдает браузер при заходе на страничку и скачивании, а потом точно такие же заголовки отправться скриптом, а там не важно чер уже, curl, file_get_contents или даже через сокеты.