Все ленты — последние статьи

Загрузка файлов средствами AJAX

Прежде всего, нужно сразу сказать, что отправить (загрузить) на сервер файл с помощью AJAX нельзя, поэтому приходится прибегать к некоторым хитростями, а конкретно — использовать скрытый фрейм iframe.

Итак, мы создаем скрытый фрейм iframe, и в атрибуте target тега form указываем имя этого фрейма. Отправка файла будет выполнена обычным способом. Но с точки зрения посетителя загрузка будет выглядеть асинхронной — страница, которую он видит, перезагружена не будет.

<form action="/upload.php" name="uploadForm" method="post" target="hiddenframe" enctype="multipart/form-data"
onsubmit="document.getElementById('res').innerHTML=''; document.getElementById('loading').style.display='block';
return true;">
<input type="file" name="userfile" />
<input type="submit" value="Загрузить" />
</form>
<div id="res" style="margin: 1em 0"></div>
<div id="loading" style="display:none; position: absolute; z-index: 99; left: 45%; top: 45%;">
<img src="/loading.gif" border="0" /> Идет загрузка…
</div>
<iframe id="hiddenframe" name="hiddenframe" style="width:0; height:0; border:0"></iframe>

Работает это так — при нажатии на кнопку submit на экране появляется изображение “loading” (загрузка), потом идет отправка формы. Когда файл загрузился, мы убираем изображение загрузки и выводим на основную страницу сообщение с результатами.

<?php
// ...............................................
sleep(5);
echo '<script type="text/javascript">';
echo 'window.parent.document.getElementById("loading").style.display="none";';
// Если загрузка прошла успешно
if (empty($error)) {
echo 'window.parent.document.getElementById("res").innerHTML="Файл успешно загружен";';
} else {
echo 'window.parent.document.getElementById("res").innerHTML="Ошибка при загрузке файла";';
}
echo '</script>';
?>

Серверный скрипт upload.php создает текстовую строку, содержащую обычный JavaScript код. Когда ответ сервера будет загружен во фрейм, код будет автоматически выполнен.

Создание файлов Excel средствами PHP

Возникла нужда создавать Excel-файлы средствами PHP. О существовании PEAR::Spreadsheet_Excel_Writer я уже знал — видел статью Создание таблиц Excel средствами PHP на http://phpclub.ru. Поиск в Google помог установить PEAR и Spreadsheet_Excel_Writer. Пример использования класса:

// We give the path to our file here
$workbook = new Spreadsheet_Excel_Writer('test.xls');

$worksheet =& $workbook->addWorksheet('My first worksheet');

$worksheet->write(0, 0, 'Name');
$worksheet->write(0, 1, 'Age');
$worksheet->write(1, 0, 'John Smith');
$worksheet->write(1, 1, 30);
$worksheet->write(2, 0, 'Johann Schmidt');
$worksheet->write(2, 1, 31);
$worksheet->write(3, 0, 'Juan Herrera');
$worksheet->write(3, 1, 32);

// We still need to explicitly close the workbook
$workbook->close();
?>

Подробнее: Создание файлов Excel средствами PHP

Класс для работы с zip-архивами

В PHP 5.2.0 был добавлен встроенный класс для работы с zip архивами на запись и чтение. Сегодня мы рассмотрим несколько примеров его использования. Прежде всего, убедитесь, что включена поддержка библиотеки php_zip.dll. Для этого в файле php.ini нужно убрать символ комментария (;) в начале строки
extension=php_zip.dll

и перезапустить Apache.

Теперь переходим к созданию архива. Все операции с архивом выполняются с помощью объекта ZipArchive. После создания экземпляра класса создаем файл архива с помощью метода open(), который в качестве параметров принимает имя архива и константу, указывающую способ открытия.

Чтобы добавить в архив файл, используем метод addFile(), который принимает два параметра: имя исходного файла и имя, под которым файл будет добавлен в архив. Завершает работу с архивом метод close().

Подробнее: Класс для работы с zip-архивами

Скачивание файлов по временным ссылкам

Наверное каждому приходилось сталкиваться с временными ссылками при скачивании фильмов, музыки, программ и т.п. Зачем это делается? Да чтобы другие сайты не размещали ссылки на файлы, которые расположены на нашем сайте. Давайте посмотрим, как написать скрипт, который будет генерить временные ссылки.

В качестве хранения информации о файлах и временных ссылках, будем использовать БД. Таблица files хранит информацию о файлах:
CREATE TABLE `files` (
`id` INT(10) PRIMARY KEY,
`title` VARCHAR(255) NOT NULL DEFAULT '',
`description` TEXT NOT NULL DEFAULT '',
`filename` VARCHAR(64) NOT NULL DEFAULT '',
`mimetype` VARCHAR(8) NOT NULL DEFAULT ''
) ENGINE=INNODB DEFAULT CHARSET=cp1251;

Здесь

Подробнее: Скачивание файлов по временным ссылкам

Как защитить файлы инклюда от прямого вызова

Сегодняшний урок я скорее всего назвал бы не уроком, а ответом на вопрос, заданном на сайте evgeniypopov.com.

Исходников нет, т.к. реализация очень простая:
demo

Итак, как это делается. Далеко ходить не будем. Рассмотрим как реализовано в CMS Joomla. В файле index.php корневой директории в самом начале есть такая строчка:


define( '_JEXEC', 1 );

А в файлах подключаемых компонетов, модулей и т.д. (тоже в самом начале) такая:


defined('_JEXEC') or die('Restricted access');

Собственно все. В index.php в корневой директории создается константа командой define c именем " _JEXEC" и значением "1". В файлах подключаемых компонетов при помощи функции defined("_JEXEC") мы проверям существование константы "_JEXEC". Если константа не найдена результат работы функции будет false, в этом случае пишем сообщение "Доступ запрещен" и останавливаем скрипт с помощью функции die (пcевдоним функции exit()).

По аналогии также делаем и у себя. Вот код демо-страницы:
файл index.php


<?php define( '_JEXEC', 1 );?>
<h2>Напишите как защитить файлы инклюда от прямого вызова! </h2>
<br />
<h4 style="color:#090">Ответ:
<?php include("inc/response.php"); ?>
</h4>

Инклюд-файл inc/response.php:

<?php
defined('_JEXEC') or die('Ай-яй-яй, сюда нельзя!');
echo 'очень просто. Этот ответ находится в "инклюдированном" файле, попробуйте обратиться к нему напрямую, дописав в строке
браузера /inc/response.php'
?>

Все очень просто. В коде я привел имя константы и ее значение в том виде, как написано в файлах Joomla. Имя константы и ее значение могут быть любыми, так что желательно придумать свое. Помните только, что имена констант пишутся в верхнем регистре.

Вот и все. по остальным вопросам ответы тоже будут, но позже. Всему свое время :)