Как на 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 Просмотров сегодня +3 19 июня 2017 команда сайта
Ещё пока нет комментариев, будь первым!
Оставить комментарий
   🔔 Отдохните не много, может Вам будет интересно прочитать статьи пользователей нашего сайта.

Тег base - это базовый адрес

В какие каталоги добавить свой сайт бесплатно

Ограничение символов вводимых в текстовое поле на JavaScript

Тег audio - это управление аудиофайлом

Как на MVC с помощью PHP загружать изображения на сервер

Как создать модуль онлайн консультации с использованием чата на ajax и php

Тег applet - это апплет

Как сделать модуль бесплатной консультации на ajax

Как на AJAX передать переменные в PHP с выводом результата в блок с проверкой условий без перезагрузки страницы

Решил и я написать статью о том, как покупал сайт на бирже ТЕЛДЕРИ

Как на MVC с помощью PHP и MySQL создать счетчик просмотров страниц

Тег article - это статья

Создание сайтов и мобильных приложений от 5 500 руб. Любой сложности!
Реклама Собственный фреймворк. Большие и сложные проекты. ТОП 100 разработчиков РФ.
Создание сайтов от 5 500 руб.
Мобильные приложения от 50 000 руб.
irogex.ru
Наши проекты Инстаграм от 6 500 руб.
Конструкторы Ugears купить в Иркутске от 690 руб. с Доставкой!
Реклама UGEARS это путешествие в удивительную атмосферу гармонии природы и совершенства конструкторской мысли
Конструктор Навигатор дат - 690 руб.
Конструктор Комбайн - 2990 руб.
ugears-irk.ru
Оплата и Доставка Контакты
Стоматология в Улан-Удэ | ДентаВита | Шок цены от 100 руб!
Реклама От всей нашей семьи хотим выразить огромную благодарность стоматологической клинике
Осмотр, консультация от 150 руб.
Рентгеновский снимок от 100 руб.
dentavita03.ru
Наши цены Отзывы
Реклама помогает поддерживать
и развивать наш сервис.


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