За последние 24 часа нас посетили 52466 программистов и 1758 роботов. Сейчас ищет 931 программист ...

[FTP] Загрузка файла клиенту через 3ю машину

Тема в разделе "Прочие вопросы по PHP", создана пользователем Naykon, 16 ноя 2015.

  1. Naykon

    Naykon Активный пользователь

    С нами с:
    15 ноя 2015
    Сообщения:
    65
    Симпатии:
    0
    Код (PHP):
    1. <?php 
    2. // Данные
    3. $ftphost   = '127.0.0.1';            // Адрес FTP сервера
    4. $ftpport   = '21';                  // Порт FTP серверар
    5. $ftpuser   = 'user';               // Пользователь FTP
    6. $ftppasswd   = 'password';            // Его пароль
    7.  
    8. // Папка, которую нужно выводить
    9. $folder      = '/addons/sourcemod/logs';
    10.  
    11. // Первые буквы файлов, которые можно выводить
    12. $prepend   = array(
    13.    'errors_',
    14.    'L',
    15. );
    16.  
    17. // Запрещенные файлы (файлы, в которых имеются такие буквы)
    18. $denyed      = array(
    19.    'vip',
    20.    'txt'
    21. );
    22.  
    23. // Отключим ошибки =)
    24.  
    25. /**
    26.  * Системный класс приложения
    27.  * @package Скрипт вывода файлов с FTP
    28.  * @author Урих Александр <urichalex@mail.ru>
    29.  * @link http://craft-soft.ru Команда разработчиков CraftSoft
    30.  */
    31.  
    32. class System {
    33.    
    34.    private $ftphost;
    35.    private $ftpport;
    36.    private $ftpuser;
    37.    private $ftppasswd;
    38.    private $logfolder;
    39.    private $res;
    40.  
    41.    /**
    42.     * Параметры для подключения к FTP
    43.     * @param string $ftphost Адрес FTP
    44.     * @param string $ftpuser Логин пользователя FTP
    45.     * @param string $ftppasswd Пароль
    46.     * @param string $ftpport Порт
    47.     * @param string $logfolder Папка, из которой брать файлы
    48.     */
    49.    public function __construct($ftphost, $ftpuser, $ftppasswd, $ftpport, $logfolder) {
    50.       $this->ftphost = $ftphost;
    51.       $this->ftpuser = $ftpuser;
    52.       $this->ftppasswd = $ftppasswd;
    53.       $this->ftpport = $ftpport;
    54.       $this->logfolder = $logfolder;
    55.       
    56.       $this->res = ftp_connect($this->ftphost, $this->ftpport);
    57.       $login = ftp_login($this->res, $this->ftpuser, $this->ftppasswd);
    58.       
    59.       if(!$this->res || !$login)
    60.       {
    61.          $this->res = FALSE;
    62.       }
    63.       ftp_chdir($this->res, $this->logfolder);
    64.    }
    65.    
    66.    public function __destruct()
    67.    {
    68.       ftp_close($this->res);
    69.    }
    70.    
    71.    /**
    72.     * Получение списка файлов
    73.     * @param string $allowed Разрешенные префиксы
    74.     * @return array Список файлов массивом
    75.     */
    76.    public function getFiles($prepend, $denyed)
    77.    {
    78.       // Получим список файлов с FTP
    79.       $files = $this->listFiles();
    80.       
    81.       // Если файлы есть, возвращаем их
    82.       if($files !== FALSE)
    83.       {
    84.          $return = array();
    85.          foreach($files as $file)
    86.          {
    87.             $file = basename($file);
    88.             if($this->check($file, $prepend, TRUE) || $this->check($file, $denyed)) continue;
    89.             $return[] = $file;
    90.          }
    91.       }
    92.       return $return;
    93.    }
    94.    
    95.    /**
    96.     * Получение файла на скачивание
    97.     * @param string $file Им файла
    98.     */
    99.    public function getFile($file)
    100.    {
    101.       $content = file_get_contents(
    102.          'ftp://'.$this->ftpuser.':'.$this->ftppasswd.'@'.$this->ftphost.'/'.$this->logfolder.'/'.$file
    103.       );
    104.       
    105.       if(!$content)
    106.          return FALSE;
    107.  
    108.       $this->sendFile($file, $content, 'application/download');
    109.    }
    110.    
    111.    private function check($string, $pattern, $prepend = FALSE)
    112.    {
    113.       if(empty($pattern))
    114.          return FALSE;
    115.       if($prepend)
    116.       {
    117.          foreach($pattern as $p)
    118.          {
    119.             $pr = substr($string, 0, strlen($p));
    120.             if($pr === $p)
    121.                return FALSE;
    122.          }
    123.          return TRUE;
    124.       }
    125.       
    126.       else
    127.       {
    128.          foreach($pattern as $p)
    129.          {
    130.             if(strpos($string, $p) !== FALSE)
    131.                return TRUE;
    132.          }
    133.       }
    134.       return FALSE;
    135.    }
    136.  
    137.    /**
    138.     * Получение списка файлов с FTP
    139.     * @return array Массив с фафлами
    140.     */
    141.    private function listFiles()
    142.    {
    143.       return ftp_nlist($this->res, '.');
    144.    }
    145.    
    146.    /**
    147.     * Отдает файл по содержимому
    148.     * @param type $fileName Имя файла
    149.     * @param type $content Содержимое файла
    150.     * @param type $mimeType MINE тип файла
    151.     */
    152.    private function sendFile($fileName,$content,$mimeType='text/plain')
    153.    {
    154.       $fileSize=(function_exists('mb_strlen') ? mb_strlen($content,'8bit') : strlen($content));
    155.       $contentStart=0;
    156.       $contentEnd=$fileSize-1;
    157.  
    158.       $length=$contentEnd-$contentStart+1;
    159.       header('HTTP/1.1 200 OK');
    160.       header('Pragma: public');
    161.       header('Expires: 0');
    162.       header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    163.       header("Content-Type: $mimeType");
    164.       header('Content-Length: '.$length);
    165.       header("Content-Disposition: attachment; filename=\"$fileName\"");
    166.       header('Content-Transfer-Encoding: binary');
    167.       $content=function_exists('mb_substr') ? mb_substr($content,$contentStart,$length) : substr($content,$contentStart,$length);
    168.  
    169.       echo $content;
    170.       exit();
    171.    }
    172. }
    173.  
    174.  
    175. $data = new System($ftphost, $ftpuser, $ftppasswd, $ftpport, $folder);
    176.  
    177. if(isset($_GET['file']))
    178.    $data->getFile($_GET['file']);
    179.  
    180. ?>
    181. <!DOCTYPE html>
    182. <html lang="ru">
    183.    <head>
    184.       <meta charset="utf-8" />
    185.       <title>Скачать файлы</title>
    186.       <style type="text/css">
    187.          table {
    188.             width: 100%
    189.          }
    190.          td {
    191.             padding: 7px;
    192.             border: 1px solid #c1c1c1
    193.          }
    194.          .container {
    195.             width: 500px;
    196.             margin: 20px auto 0 auto;
    197.          }
    198.       </style>
    199.    </head>
    200.    <body>
    201.       <div class="container">
    202.          <h3>Скачать файлы</h3>
    203.          <table>
    204.             <?php foreach($data->getFiles($prepend, $denyed) as $file):?>
    205.             <tr>
    206.                <td>
    207.                   [url="?file=<?php echo $file?>"]<?php echo $file?>[/url]
    208.                </td>
    209.             </tr>
    210.             <?php endforeach;?>
    211.          </table>   
    212.       </div>
    213.    </body>
    214. </html>
    Есть:
    FTP - 1 МАШИНА
    WEB - 2 МАШИНА (сам сайт на котором стоит php код который выше)
    CLIENT - 3 МАШИНА (клиент который должен скачивать файлы..)

    Здравствуйте, этот скрипт берет нужные файлы с FTP и транслирует их в html пользователю. Файлы получает и выводит на экран нормально, но не скачивается...(( Подскажите почему не скачивается и как можно это исправить?

    Проще говоря http://194.79.60.34/csgo_dem.php вот...

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв