Файл представляет собой последовательность байтов, хранящуюся на каком-либо физическом носителе информации. Каждый файл имеет абсолютный путь, по которому определяется его местонахождение. В качестве разделителя пути в Windows может использоваться как прямой (/), так и обратный (\) слеш. В других операционных системах используется только прямой слеш.
Открытие файлов в файловой системе сервера производится при помощи функции fopen:
int fopen(string filename, string mode [, int use_include_path])
Первый аргумент filename - имя файла или абсолютный путь к нему. Если абсолютный путь не указывается, то файл должен находится в текущем каталоге.
Второй аргумент mode говорит о том, для каких действий открывается файл и может принимать следующие значения:
• r (Открыть файл только для чтения; после открытия указатель файла устанавливается в начало файла);
• r+ (Открыть файл для чтения и записи; после открытия указатель файла устанавливается в начало файла);
• w (Создать новый пустой файл только для записи; если файл с таким именем уже есть вся информация в нем уничтожается);
• w+ (Создать новый пустой файл для чтения записи; если файл с таким именем уже есть вся информация в нем уничтожается);
• a (Открыть файл для дозаписи; данные будут записываться в конец файла);
• a+ (Открыть файл для дозаписи и чтения данных; данные будут записываться в конец файла);
• b (Флаг, указывающий на работу (чтение и запись) с двоичным файлом; указывается только в Windows).
Третий необязательный аргумент use_include_path определяет должны ли искаться файлы в каталоге include_path. (Параметр include_path устанавливается в файле php.ini).
В случае успешного открытия файла, функция fopen возвращает дескриптор файла, а в противном случае - false. Дескриптор файла представляет собой указатель на открытый файл, который используется операционной системой для поддержки операций с этим файлом. Возвращенный функцией дескриптор файла необходимо затем указывать во всех функциях, которые в дальнейшем будут работать с этим файлом.
Код, приведенный ниже, открывает файл C:/WWW/HTML/file.txt для чтения:
<?
$file = fopen("c:/www/html/file.txt","r");
if(!file)
{
echo("Ошибка открытия файла");
}
?>
Открытие двоичного файла, к примеру, рисунка происходит таким же образом, только с флагом b:
<?
$file = fopen("c:/www/html/river.jpg","rb");
if(!file)
{
echo("Ошибка открытия файла");
}
?>
Содержимое открытого файла можно отобразить в браузере с помощью функции fpassthru:
int fpassthru (int file)
Аргумент file представляет собой дескриптор файла.
<?
$file = fopen("c:/www/html/pavlovo.jpg","rb");
if(!file)
{
echo("Ошибка открытия файла");
}
else
{
fpassthru($file);
}
?>
Для текстовых файлов существует еще одна функция отображения readfile:
readfile (string filename)
Обращаем ваше внимание на то, что в качестве аргумента эта функция принимает имя файла, а не его дескриптор:
<?
readfile ("file.txt");
?>
После того, как вы закончите работу с файлом его необходимо закрыть. Закрытие файлов осуществляется с помощью функции fclose:
int fclose (int file)
Аргумент file представляет собой дескриптор файла, который необходимо закрыть. Прочитать строку из открытого файла можно с помощью функции fread:
string fread ( int file, int length )
Эта функция возвращает строку длиной length символов из файла с дескриптором file.
Пример (чтение из файла):
<?
$file = fopen("c:/www/html/file.txt","r");
if(!file)
{
echo("Ошибка открытия файла");
}
else
{
$buff = fread ($file,100);
print $buff;
}
?>
Для чтения из файла можно также пользоваться функцией fgets:
string fgets ( int file, int length)
Эта функция читает и возвращает строку длиной length - 1 байт. Чтение прекращается, когда достигнута новая строка или конец файла. При достижении конца файла функция возвращает пустую строку.
Для чтения файла с удалением из него тегов HTML применяется функция fgetss:
string fgetss (int file, int length [, string allowable_tags])
Необязательный третий параметр allowable_tags может содержать строку со списком тегов, которые не должны быть отброшены, при этом теги в строке записываются через запятую.
Если необходимо записать содержимое файла в массив, применяется функция file:
array file (string filename [, int use_include_path])
Функция считывает файл с именем filename и возвращает массив, каждый элемент которого соответствует строке в прочитанном файле. В следующем примере с помощью функции читается файл, информация из которого затем выводится в браузер.
<?
$file_array = file("file.txt");
if(!$file_array)
{
echo("Ошибка открытия файла");
}
else
{
for($i=0; $i < count($file_array); $i++)
{
printf("%s<br>", $file_array[$i]);
}
}
?>
Эта функция удобна также тем, что с ее помощью можно легко подсчитать количество строк в файле:
<?
$file_array = file ("file.txt");
if(!$file_array)
{
echo("Ошибка открытия файла");
}
else
{
$num_str = count($file_array);
echo($num_str);
}
?>
Заметим, что функцию file следует применять лишь для чтения небольших файлов.
Для чтения файлов с расширением *.csv применяется функция fgetcsv:
array fgetcsv ( int file, int length, char delim)
Функция читает строку из файла и разбивает ее по символу delim. Параметр delim должен обязательно быть строкой из одного символа, иначе принимается во внимание только первый символ этой строки. Функция возвращает получившийся массив или false, если достигнут конец файла. Пустые строки в файле не игнорируются, а возвращаются как массив из одного элемента - пустой строки. Параметр length задает максимальную длину строки точно так же, как это делается в функции fgets.
Формат CSV является одним из форматов, в котором может сохранять файлы MSExcel. В следующем примере производится чтение созданного MSExcel файла file.csv, содержащего пароли пользователей.
<?
$count = 1;
$file = fopen ("file.csv","r");
while ($data = fgetcsv ($file, 1000, ","))
{
$num = count ($data);
$count++;
for ($i=0; $i < $num; $i++)
{
print "$data[$i]<br>";
}
}
fclose ( $file );
?>
Запись в файлы осуществляется функциями fputs и fwrite, которые абсолютно идентичны:
int fputs ( int file, string string [, int length ])
int fwrite ( int file, string string [, int length ])
Первый аргумент - дескриптор файла, в который осуществляется запись. Второй аргумент представляет собой строку, которая должна быть записана в файл. Третий необязательный аргумент задает количество символов в строке, которые должны быть записаны. Если третий аргумент не указан, записывается вся строка.
В этом примере в файл "file.txt" записывается строка "Hello, world!"
<?
$file = fopen ("file.txt","r+");
$str = "Hello, world!";
if ( !$file )
{
echo("Ошибка открытия файла");
}
else
{
fputs ( $file, $str);
}
fclose ($file);
?>
Копирование файлов осуществляется функцией copy:
int copy ( string file1, string file2)
Функция копирует файл с именем file1 в файл с именем file2. Если файл file2 на момент копирования существовал, то он перезаписывается.
Переименование файла производится с помощью функции rename:
int rename ( string old, string new)
Эта функция переименовывает файл с именем old в файл с именем new.
Функция rename не выполняет переименования файла, если его новое имя расположено в другой файловой системе.
Удаление файла осуществляется посредством функции unlink:
int unlink ( string filename)
При чтении данных из файла указатель текущей позиции перемещается к очередному непрочитанному символу. Существует несколько функций, с помощью которых можно управлять положением этого указателя.
Установка указателя текущей позиции в начало файла производится функцией rewind:
int rewind ( int file)
Аргумент file является дескриптором файла.
Узнать текущее положение указателя можно при помощи функции ftell:
int ftell ( int file)
Установить указатель в любое место файла можно, используя функцию fseek:
int fseek ( int file, int offset [, int whence ])
Функция fseek устанавливает указатель файла на байт со смещением offset (от начала файла, от его конца или от текущей позиции, в зависимости от значения параметра whence). Аргумент file представляет собой дескриптор файла. Аргумент whence задает с какого места отсчитывается смещение offset и может принимать одно из следующих значений:
• SEEK_SET (отсчитывает позицию начала файла);
• SEEK_CUR (отсчитывает позицию относительно текущего положения указателя);
• SEEK_END (отсчитывает позицию относительно конца файла).
По умолчанию аргумент whence имеет значение SEEK_SET.
Узнать, находится ли указатель в конце файла, можно с помощью функции feof:
int feof ( int file)
Если указатель находится в конце файла, функция возвращает true, в ином случае возвращается false.
Функцию feof удобно использовать при чтении файла:
<?
$file = fopen ("file.txt","r");
if ($file)
{
while(!feof($file))
{
$str = fgets($file);
echo $str;
echo ("<br>");
}
fclose ( $file);
}
else
{
echo("Ошибка открытия файла");
}
?>
При помощи этой функции удобно также определять количество строк в файле:
<?
$file = fopen ("file.txt","r");
if ($file)
{
$counter = 0;
while(!feof($file))
{
$str = fgets ($file);
$counter++;
}
echo($counter);
fclose ($file);
}
else
{
echo("Ошибка открытия файла");
}
?>
Методы HTTP PUT и HTTP POST предназначены для загрузки файлов на сервер.
Протокол HTTP предоставляет три метода для работы с информацией, находящейся на Web-сервере: GET, PUT и POST. Метод GET применяется для получения Web-страниц, при этом все переменные формы передаются в URL. Поскольку на многих Web-серверах установлено ограничение на максимальную длину URL (как правило, не более 1024), не стоит применять метод GET, если требуется передача данных большего объема.
Метод PUT применяется для обновления информации на сервере, и требует, чтобы содержимое запроса HTTP PUT сохранялось на сервере. Запрос выглядит таким образом:
PUT /path/filename.html HTTP/1.1
В этом случае Web-сервер должен сохранить содержимое этого запроса в виде /path/filename.html в пространстве имен URL Web-сервера. По умолчанию сам Web-сервер не выполняет такие запросы, а задает CGI-сценарий для их обработки. В Apache назначить сценарий для обработки PUT-запросов, можно изменив директиву Script, находящуюся в файле httpd.conf, к примеру, так:
Script PUT /cgi-bin/put.cgi
Это означает, что обрабатывать PUT-запросы будет CGI-скрипт put.cgi.
Как правило, для загрузки файлов на сервер используют метод HTTP POST. Этот метод позволяет передавать большие объемы данных из формы и сохраняет все переменные формы в теле запроса.
Рассмотрим распространенный пример программирования для Internet – гостевую книгу.
Гостевая книга — это место на сайте, где ваши посетители могут оставлять свои сообщения: отзывы на сайт, замечания, пожелания и т. д. Здесь же хранятся и ранее опубликованные сообщения.
Например, в рамках курса, гостевая книга может использоваться для сбора и анализа мнения потребителей о каком-либо продукте или услуге.
В отличие от форума, посетители гостевой книги не могут отвечать на сообщения, оставленные другими посетителями, и тем самым завязывать дискуссию или полемику по какому-то вопросу.
Зайдя в гостевую книгу, ваши посетители увидят форму для отправки сообщения и список предыдущих сообщений. Форма, помимо текста сообщения, включает поля для ввода имени посетителя, адреса e-mail и веб-адреса, хотя эти поля и не являются обязательными. Кроме того, в момент добавления сообщения автоматически проставляются текущие дата и время.
Рассмотрим пример гостевой книги на языке php, представленный в листинге 1 для хранения отзывов пользователей используется обычный текстовый файл.
Пример гостевой книги на php.
<?php
include "banner.htm";
//Описываем константы
$ip = $REMOTE_ADDR;//Откуда пришел гость - для дальнейших поисков :=)
$gbpath="guestbook.dat";//Где будут храниться сообщения
$date = date("d-m-Y");//Дата в формате ДД:ММ:ГГ что бы знать когда сделана запись
//Задаем метод получения окружения при запросе GET
Индивидуальное задание:Разработать гостевую книгу коммерческой компании для сбора мнений о новом товаре и внедрить ее в разработанную в первой лабораторной работе структуру сайта. Запретить добавлять пустые сообщения с выводом просьбы повтора заполнения (обязательные поля – имя, сообщение).
Ввод пользовательских сообщений реализовать путем заполнения полей: имя, e-mail, домашняя страничка, текст сообщения и нажатия на кнопку “Добавить”. Реализовать просмотр всех оставленных пользователями сообщений.