Облако ссылок Добавить сайт Опубликовать Пользователи Категории

Сервис полезной информации


Размещайте полезную информацию и одновременно продвигайте свои проекты.


Узнать больше

Как на MVC с помощью PHP правильно загружать файлы с сервера. Часть Вторая


X

Как на MVC с помощью PHP правильно загружать файлы с сервера. Часть Вторая

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

Для отображения файла на странице мы будем использовать данные из базы данных.

Заходим в папку config и открываем файл routes.php. В него добавляем маршрут нашего будущего файла:

'files' => 'site/allFiles',

 

Теперь переходим в директорию views/site и создаем файл all_files.php. Он будет содержать следующий код:

<?php
function image($rash)
{
    if ($rash == 'jpg') {
        return 'jpg.png';
    }
    if ($rash == 'jpeg') {
        return 'jpeg.png';
    }
    if ($rash == 'zip') {
        return 'zip.png';
    }
    if ($rash == 'png') {
        return 'png.png';
    }
    if ($rash == 'rar') {
        return 'rar.png';
    }
    if ($rash == 'zip') {
        return 'zip.png';
    }
    if ($rash == 'txt') {
        return 'txt.png';
    }
    if ($rash == 'xls') {
        return 'xls.png';
    }
    if ($rash == 'xlsx') {
        return 'xlsx.png';
    }
    if ($rash == 'doc') {
        return 'doc.png';
    }
    if ($rash == 'docx') {
        return 'docx.png';
    }
    if ($rash == 'pdf') {
        return 'pdf.png';
    }
    if ($rash == 'PDF') {
        return 'pdf.png';
    }
}
?>

 

Сначала описывается функция, выбирающая картинку к файлу, исходя из расширения файла, которое хранится в базе данных.

<html>
<head></head>
<body>
<table>
    <? foreach ($files as $files): ?>
        <? //Инцилизация даты
        $exp = explode(' ', $files['date']);
        $exp1 = explode('-', $exp[0]);
        $date = $exp1[2].'.'.$exp1[1].'.'.$exp1[0];
        ?>
        <tr>
            <td style="width: 100px;">
                <img src='../../template/images/<?= image($files['rash']); ?>' style="height: 90px;">
            </td>
            <td style="width: 300px; padding-left: 20px;">
                Имя файла: <? echo $files['title']; ?><br>
                Дата загрузки: <? echo $date;  ?>
            </td>
            <td style="width: 100px; padding-left: 20px; text-align: center;">
                <a href="../components/down_files.php?filename=<?='../img/'.$files['url'].'.'.$files['rash']; ?>">Скачать файл</a>
            </td>
        </tr>
    <? endforeach; ?>
</table>
</body>
</html>

 

Далее с помощью цикла foreach будем выводить каждый файл.  При отрисовке страницы вызывается функция модели Page, которая получает данные обо всех файлах и записывает их в массив files (он будет описан ниже).

В цикле сначала получаем дату загрузки файла. Тип поля date в базе данных – datetime, поэтому из массива мы получаем строку вида: DD-MM-YYYY 00:00:00. Преобразуем эту строку путем разбиения ее через пробел, а затем первую ее часть через тире. В результате получаем массив с днем, месяцем и годом. Собираем значения массива в строку, скрепляя значения точками, получаем строку вида: DD.MM.YYYY.

Картинки, которые будут выводиться исходя из расширений, мы поместим в директорию template/images, ее необходимо будет создать. Сами картинки будут иметь названия расширений, т.е. jpg, docx и т.д.

Используя созданную выше переменную date, выводим дату загрузки. Далее, используя массив files, выводим имя файла и составляем путь для загрузки наших файлов.

Заходим в папку controllers и открываем файл SiteController.php. В нем пишем метод для отрисовки страницы, внутри которого будем получать массив с данными файла из базы данных:

public function actionAllFiles() { 
    $files = Page::getFiles();
    require_once(ROOT . '/views/site/all_files.php');
    return true; 
}

 

Теперь заходим в папку models и открываем файл Page.php, в нем мы опишем функцию, которая будет получать данные из базы данных:

public static function getFiles()
{
    $db = Db::getConnection();
    $result = $db->query('SELECT * FROM files ORDER BY id DESC');
    $files = array();
    $i = 0;
    while ($row = $result->fetch()) {
        $files[$i]['id'] = $row['id'];
        $files[$i]['title'] = $row['title'];
        $files[$i]['date'] = $row['date'];
        $files[$i]['url'] = $row['url'];
        $files[$i]['rash'] = $row['rash'];
        $files[$i]['size'] = $row['size'];
        $i++;
    }
    return $files;
}

 

И самое главное, теперь нам нужно создать файл, который будет инициализировать саму загрузку файла. Заходим в папку components и создаем там файл down_files.php. Файл будет содержать следующий код:

<?php
$filename = $_GET['filename'];

// нужен для Internet Explorer, иначе Content-Disposition игнорируется
if(ini_get('zlib.output_compression'))
    ini_set('zlib.output_compression', 'Off');

 

Получаем методом GET название файла. Отключаем сжатие страниц, это нужно для IE, чтобы он не игнорировал Content-Disposition.

$file_extension = strtolower(substr(strrchr($filename,"."),1));

if( $filename == "" )
{
    echo "ОШИБКА: не указано имя файла.";
    exit;
} elseif ( ! file_exists( $filename ) ) // проверяем существует ли указанный файл
{
    echo "ОШИБКА: данного файла не существует.";
    exit;
};

 

Получаем расширение файла и проверяем, существует ли указанный файл.

switch( $file_extension )
{
    case "pdf": $ctype="application/pdf"; break;
    case "zip": $ctype="application/zip"; break;
    case "rar": $ctype="application/rar"; break;
    case "doc": $ctype="application/msword"; break;
    case "xls": $ctype="application/vnd.ms-excel"; break;
    case "xlsx":
    case "png": $ctype="image/png"; break;
    case "jpeg":
    case "jpg": $ctype="image/jpg"; break;
    default: $ctype="application/force-download";
}

 

Исходя из полученного расширения, выставляем кодировку скачиваемого документа.

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // нужен для некоторых браузеров
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");
exit();

 

Скрипт, который будет скачивать файлы, использует вышесказанные параметры.

Grai Просмотров сегодня +2 19 июня 2017 команда сайта
Реклама помогает поддерживать
и развивать наш сервис.


Подробнее
(ссылка откроется в новой вкладке)
  Реклама