Скачать через PHP. Подскажите.

Статус
В этой теме нельзя размещать новые ответы.

Pigini

Знаток
Регистрация
28 Апр 2009
Сообщения
173
Реакции
29
Привет всем.

Есть мой сайт - Для просмотра ссылки Войди или Зарегистрируйся
Есть сайт где лежат файлы - Для просмотра ссылки Войди или Зарегистрируйся

Я хочу, что бы скачивалось через мой PHP, то есть -
Файл вот так выглядит - Для просмотра ссылки Войди или Зарегистрируйся123321
НО для его скачивания нужно открыть страницу 2 раза!
Значит должно быть так, у меня на хосте например Для просмотра ссылки Войди или Зарегистрируйся и ссылку я вставляю например так - Для просмотра ссылки Войди или Зарегистрируйся123321, в скрипте прописано, что файл находится Для просмотра ссылки Войди или Зарегистрируйся123321 и главное, что обратится к адресу Для просмотра ссылки Войди или Зарегистрируйся123321 нужно 2 раза! Так как при обращение первый раз скачивания нету, а второй раз когда набираешь то есть.

Ну добрый, любимые форумчане, помогите как реализовать PHP скрипт file.php


P.S. Все ссылки это как пример. Таких сайтов нет.
 
юзай cURL, либо выкачивый octet/streat двумя file_get_contents()
 
что-то типо этого:
Этими заголовками даём знать что файл нужно скачать, а не показывать в браузере.
Код:
header("Content-Disposition: attachment; filename=Nevep");
header("Content-Type: application/x-force-download; name=\"Nevep\"");
echo file_get_contents($url);
$url прямая ссылка на файл. как её получить смотри сам, прощё всего регулярками preg_match()
 
В таком случае, если юзер качалкой качать будет, то раскроется истинный путь файла, правильно?
 
Извините если не по теме, но подскажите, как сделать так, чтобы в строке состояния браузера не отображались адреса ссылок при на их наведении и переходе по ним. Например для того, чтобы скрывать реферальные ссылки от посетителей. Такое можно сделать средствами php? Или лучше для этого использовать JS?
 
у меня такая функция работает:
PHP:
 function output_file($file,$name)
 {
 //do something on download abort/finish
 //register_shutdown_function( 'function_name'  );
 if(!file_exists($file))
 die('file not exist!');
 $size = filesize($file);
 $name = rawurldecode($name);
 if (ereg('Opera(/| )([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT']))
 $UserBrowser = "Opera";
 elseif (ereg('MSIE ([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT']))
 $UserBrowser = "IE";
 else
 $UserBrowser = '';
 /// important for download im most browser
 $mime_type = ($UserBrowser == 'IE' || $UserBrowser == 'Opera') ?
  'application/octetstream' : 'application/octet-stream';
 @ob_end_clean(); /// decrease cpu usage extreme
 header('Content-Type: ' . $mime_type);
 header('Content-Disposition: attachment; filename="'.$name.'"');
 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
 header('Accept-Ranges: bytes');
 header("Cache-control: private");
 header('Pragma: private');
 /////  multipart-download and resume-download
 if(isset($_SERVER['HTTP_RANGE']))
 {
 list($a, $range) = explode("=",$_SERVER['HTTP_RANGE']);
 str_replace($range, "-", $range);
 $size2 = $size-1;
 $new_length = $size-$range;
 header("HTTP/1.1 206 Partial Content");
 header("Content-Length: $new_length");
 header("Content-Range: bytes $range$size2/$size");
 }
 else
 {
 $size2=$size-1;
 header("Content-Length: ".$size);
 }
 $chunksize = 1*(1024*1024);
 $bytes_send = 0;
 if ($file = fopen($file, 'r'))
 {
 if(isset($_SERVER['HTTP_RANGE']))
 fseek($file, $range);
 while(!feof($file) and (connection_status()==0))
 {
 $buffer = fread($file, $chunksize);
 print($buffer);//echo($buffer); // is also possible
 flush();
 $bytes_send += strlen($buffer);
 //sleep(1);//// decrease download speed
 }
 fclose($file);
 }
 else
 die('error can not open file');
 if(isset($new_length))
 $size = $new_length;
 die();
 }
и вызов:
PHP:
$file = "downloads/files/file1.doc";
$name=$fileID; 
output_file($file,$name);

Добавлено через 6 минут
Извините если не по теме, но подскажите, как сделать так, чтобы в строке состояния браузера не отображались адреса ссылок при на их наведении и переходе по ним. Например для того, чтобы скрывать реферальные ссылки от посетителей. Такое можно сделать средствами php? Или лучше для этого использовать JS?
Скрыть можно только через РНР, сделать файл redir.php
которому передвать параметр скажем ID "ссылки", в самом файле в соотвествии с ID переменной $url примваивается УРЛ куда переходить и затем строка:
PHP:
header ("Location: $url");
 
В таком случае, если юзер качалкой качать будет, то раскроется истинный путь файла, правильно?

Что значит истинный путь?
Если я вас правильно понял, то путь скачиваемого файла - это путь скрипта пхп. Юзер не узнает что файл находится не у вас на сайте. Но...этот способ потребляет много траффика, т.е. если файл большой, то ваш сервер сначала его качает, затем отдаёт, следовательно скрипт будет некоторое время качать его, а затем только отдаст на скачку. Каждый раз когда кто-то захочет скачать файл - ваш сервер его будет заново скачивать.
PHP:
<?php
header("Content-Disposition: attachment; filename=Nevep");
header("Content-Type: application/x-force-download; name=\"Nevep\"");
echo file_get_contents("http://google.com/robots.txt");
?>
Ваш сервер скачает, а затем отдаст на скачку файл robots.txt
 
Не будет такая хрень работать. Для Для просмотра ссылки Войди или Зарегистрируйся или другого какого небольшого файла еще ладно, а если такой функцией как sulacco писал, т.е. чтоб порциями скачивало и тут же отдавало юзеру - не будет работать. Я пробовал и так, и сяк, там идет рассинхронизация $buffer, как результат рвется коннекшен, как результат у юзера файл не докачан. 206 Partial Content проблему тоже не решил.

Реально пришлось на хостинге завести кеш, и двумя разными процессами в этом кеше с одной стороны дописывать в файл а с другой его отдавать юзеру. И места в кеше должно хватить на столько ПОЛНЫХ файлов, сколько через вас разные юзеры могут теоретически одновременно качать. И после чтения/записи в файл его надо тут же закрывать, а при следующем открытии делать fseek() на запомненную позицию, чтобы файл не лочился и filesize() обновлялось. Короче целая история.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху