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

Тема в разделе "PHP", создана пользователем Pigini, 17 фев 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Pigini

    Pigini

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

    Есть мой сайт - www.site.ru
    Есть сайт где лежат файлы - www.files.ru

    Я хочу, что бы скачивалось через мой PHP, то есть -
    Файл вот так выглядит - www.files.ru/123321
    НО для его скачивания нужно открыть страницу 2 раза!
    Значит должно быть так, у меня на хосте например www.site.ru/file.php и ссылку я вставляю например так - www.site.ru/file.php?=123321, в скрипте прописано, что файл находится www.files.ru/123321 и главное, что обратится к адресу www.files.ru/123321 нужно 2 раза! Так как при обращение первый раз скачивания нету, а второй раз когда набираешь то есть.

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


    P.S. Все ссылки это как пример. Таких сайтов нет.
     
  2. Miraage

    Miraage Angular/Laravel

    Регистр.:
    3 июн 2008
    Сообщения:
    230
    Симпатии:
    51
    юзай cURL, либо выкачивый octet/streat двумя file_get_contents()
     
  3. Nevep

    Nevep Постоялец

    Регистр.:
    16 дек 2009
    Сообщения:
    59
    Симпатии:
    8
    что-то типо этого:
    Этими заголовками даём знать что файл нужно скачать, а не показывать в браузере.
    Код:
    header("Content-Disposition: attachment; filename=Nevep");
    header("Content-Type: application/x-force-download; name=\"Nevep\"");
    echo file_get_contents($url);
    
    $url прямая ссылка на файл. как её получить смотри сам, прощё всего регулярками preg_match()
     
  4. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    В таком случае, если юзер качалкой качать будет, то раскроется истинный путь файла, правильно?header("Content-Disposition: attachment; filename=Nevep");
    header("Content-Type: application/x-force-download; name=\"Nevep\"");
    echo file_get_contents($url);
     
  5. LodeRunner

    LodeRunner

    Регистр.:
    10 фев 2010
    Сообщения:
    220
    Симпатии:
    12
    Извините если не по теме, но подскажите, как сделать так, чтобы в строке состояния браузера не отображались адреса ссылок при на их наведении и переходе по ним. Например для того, чтобы скрывать реферальные ссылки от посетителей. Такое можно сделать средствами php? Или лучше для этого использовать JS?
     
  6. sulacco

    sulacco Постоялец

    Регистр.:
    17 мар 2008
    Сообщения:
    90
    Симпатии:
    45
    у меня такая функция работает:
    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 минут
    Скрыть можно только через РНР, сделать файл redir.php
    которому передвать параметр скажем ID "ссылки", в самом файле в соотвествии с ID переменной $url примваивается УРЛ куда переходить и затем строка:
    PHP:
    header ("Location: $url");
     
  7. Nevep

    Nevep Постоялец

    Регистр.:
    16 дек 2009
    Сообщения:
    59
    Симпатии:
    8
    Что значит истинный путь?
    Если я вас правильно понял, то путь скачиваемого файла - это путь скрипта пхп. Юзер не узнает что файл находится не у вас на сайте. Но...этот способ потребляет много траффика, т.е. если файл большой, то ваш сервер сначала его качает, затем отдаёт, следовательно скрипт будет некоторое время качать его, а затем только отдаст на скачку. Каждый раз когда кто-то захочет скачать файл - ваш сервер его будет заново скачивать.
    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
     
  8. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Не будет такая хрень работать. Для http://google.com/robots.txt или другого какого небольшого файла еще ладно, а если такой функцией как sulacco писал, т.е. чтоб порциями скачивало и тут же отдавало юзеру - не будет работать. Я пробовал и так, и сяк, там идет рассинхронизация $buffer, как результат рвется коннекшен, как результат у юзера файл не докачан. 206 Partial Content проблему тоже не решил.

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