В первой части мы рассматривали, как загрузить файлы на сервер, в этой части мы будем рассматривать, как скачать файлы с сервера на компьютер.
Для отображения файла на странице мы будем использовать данные из базы данных.
Заходим в папку 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();
Скрипт, который будет скачивать файлы, использует вышесказанные параметры.
Ещё пока нет комментариев, будь первым!