Ваш первый Сайт С использованием РНР-скриптов
СОЗДАНИЕ ФОРМЫ ДЛЯ ЗАГРУЗКИ ГРАФИЧЕСКИХ ФАЙЛОВ
Итак, сначала мы создадим страницу с формой, при помощи которой можно будет закачивать фотографии на сервер в отдельную папку. Также можно будет создать надпись под каждой фотографией. Все надписи, естественно, должны быть сохранены в отдельном текстовом файле. На данной странице будет не только форма, но и программа со сценарием для закачки файлов, т. е. в теге <form> в параметре action мы укажем ту же страницу, где и будет наша форма. Такой прием мы уже неоднократно использовали в приложениях из прошлых глав. Затем мы напишем программу для вывода мини - копий этих фотографий и надписей к ним на web-страницу.
Для начала в папке risynki создайте две подпапки под названием: 1 .foto - Для закачки туда фотографий; 2. fotomin - для хранения там мини-копий фотографий, которые будут создаваться там программно. Затем также в папке Risynki создайте пустой текстовый файл foto.txt, где у нас будут храниться надписи под фотографиями.
В РНР-редакторе создайте новый файл и сохраните его в папке risynki Под именем zagryzkaObych.php. Желательно сначала разобраться с листингом 8.3 (разборка кода после листинга), а потом набрать эту программу в редакторе самостоятельно.
Листинг 8.3 (файл ZagryzkaObych.Php) <Html> <Head>
<Ш1Е>Загрузка Фотографий</Ш1Е> <link type="text/css" rel="stylesheet" href="stil. css"> </head>
<body bgcolor="#COCOCO"> <div id="lplp">MoH Фотографии<ЛНу> <1>3Акачать Фото<ЛхЬг> <?php
Echo "<form enctype='multipart/form-dataf action=zagryzkaObych. php method=POST>
<input type=FILE name=zak><br><br> <1>Подпись Под Фотографией<ЛхЬг> <input type=TEXT name=text size=50><br><br> cinput type=SUBMIT name=otpr Уа1Ие='Отправить'> </form>";
If ($_POST[,otpr,]==true) {
$zak=$_POST[,zak']; $file=$_FILES[,zak'][,name'l; $size=$_FILES['zak,]['sizef]; $nadp=$_POST['text'];
$ext=array(,,.jpg,^".gif^".png",,^JPG,^".GIF, l,,,.PNG,,);
If(in_array(strrchr($file, "."), $ext))
{
If(copy($_FILES["zak"] ["tmp_name"], "foto/".Sfile))
{
Echo "Файл ".Sfile." Объемом: ".Ssize." Байт Успешно Закачан!<Ьг>"; $mass=flle("foto. txt");
If(!in_array($flle."|".$nadp. chr(13).chr(10), $mass)) {
$foto=fopen("foto. txt", "a");
Fwrite($foto, Sfile."|".$nadp. chr(13).chr(10));
Fclose(Sfoto);
Exit(); }
}
Else
{
Echo "Ошибка При Закачке Файла! Повторите попытку.<br>";
ExitO; }
}
Else {
Echo "Расширение закачиваемых файлов должно быть jpg, gif, png, JPG, GIF, PNG! Повторите попытку.<Ьг>";
Exit(); }
} ?>
</body> </html>
Результат запуска этого скрипта вы уже видели на рис. 8.2. Теперь разберем строчки кода, начиная с тега <?php:
<?php - начало РНР-кода;
Echo "<form enctype='multipart/form-data' action=zagryzkaObych.php method=POST> - создаем форму для отправки файла методом post. Данные из этой формы после нажатия кнопки «Отправить» передадутся вновь на эту же страницу (Action=zagryzkaObych.php);
<input type=FILE name=zak><br><br> - создаем поле для ввода имени загружаемого на сервер файла (точнее, пути к нему); </>Подпись под фотографией<И><Ьг>
<input type-TEXT name=text size=50><br><br> - создае^ текстовое поле для ввода надписи под фотографией;
<input type=SUBMIT name^otpr value-'Omnpaeumb'> - создаем кнопку для отправки данных из формы;
</form>"; - закрываем тег формы;
If ($_POST['otpr']==true) - если элемент суперглобального массива $_POST['otpr'] определен, т. е. мы ввели данные в форму и нажали кнопку «Отправить» (а кнопка имеет имя name=otpr), то выполнится весь код между фигурными скобками под номером 1;
Ц
$zak=$_POST['zak']; - з переменной $zak сохраняем путь к закачиваемому файлу, указанному в форме в поле с именем name=zak;
Sfile=S_FILES['zak'] ['пате']; - переменной Sfile присваиваем имя закачиваемого файла. Оно хранится в элементе $ FILES['zak']['пате'] массива S FILES, созданного при передаче данных из формы (см. разд. 8.1-8.3);
$size=S_FILES['zak']['size']; - переменной Ssize присваиваем размер закачиваемого файла в байтах;
$nadp=$ POST['text']; - переменной Snadp присваиваем содержимое текстового поля с именем name=text из формы. А в это поле мы записали надпись под фотографией;
Sext=array(".jpg",".gif',".png",".JPG",".GIF",".PNG"); - создаем массив Sext С шестью элементами, указывающими на расширение графических файлов. Мы предполагаем, что будут закачиваться только 3 типа графических файлов с расширениями jpg, gif К png (или с такими же расширениями, но из заглавных букв). Вы можете добавить сюда и другие расширения для графических файлов;
If(in_array(strrchr(Sfde, "."), Sext)) - сначала вспомним, что функция strrchr (см. гл. 4) возвращает часть строки, начиная с символа, указанного во втором аргументе (в нашем случае это точка), и до конца строки, т. е. данная функция возвратит нам расширение файла. Затем функция in_array ищет в массиве Sext элемент, указанный в первом аргументе, а первый аргумент у нас Strrchr (Sfile, "."), т. е. расширение файла. Короче, условие //проверяет, имеет ли закачиваемый файл расширение, соответствующее хотя бы одному из элементов массива Sext. Если закачиваемый файл графический и имеет расширение jpg, gz/или png (или с такими же расширениями, но из заглавных букв), то выполнится блок команд между фигурными скобками под номером 2; 2{
If(copy($_FILES["zak"]["tmp_name"], "foto/".Sfile)) - функция сору копирует файл из переменной $ FILES["zak"]["tmpПате"] в папку/о/о (мы ее создали заранее) и сохраняет ее там под именем, которое у нас в переменной Sfile (т. е. под тем же именем). В переменную (S FILES["zak"]["tmp name"], Как было сказано выше, записывается то имя, которое загруженный файл имеет в папке временных файлов. Если файл удачно скопирован и сохранен, то выполнится блок команд между фигурными скобками под номером 3;
Echo "Файл ".Sfile." Объемом: ".Ssize." Байт успешно закачан!<br>"; - при удачном выполнении прошлой команды в браузер выведется надпись, что файл под названием Sfile и объемом Ssize (а в переменной Ssize у нас размер закачиваемого файла в байтах) успешно закачан;
Smass=file("foto.txt"); - в текстовом файле foto.txt, который мы создали заранее, будут храниться надписи под фотографиями. Причем, как вы увидите позже, записываться и храниться они будут в виде таблицы с двумя столбцами. Первый столбец будет содержать название графического файла с расширением, второй - надпись под этим графическим файлом. Столбцы будут разделены символом «|». Функция file считывает текстовый файл foto.txt И возвращает массив строк (см. гл. 4) из этого файла. Весь массив сохраняем в переменной $mass;
If(!in_array($file."".$nadp.chr(13).chr(10), $mass)) - ищем в массиве $mass Строку с названием загружаемого файла и надписью под ним, т. е. проверяем, загружали ли мы уже этот файл. Это мы делаем для того, чтобы: во-первых, вы не загружали один к тот же файл несколько раз; во-вторых, если при отправке данных из формы сервер потребует повторную отправку (см. рис. 6.1), то в текстовый файл уже не будут записываться вторично название и надпись для одного и того же файла. Итак, если такой строки с именем и надписью для загружаемого файла еще не существует, то выполнится код между фигурными скобками под номером 4;
$foto=fopen("foto.txt", "а"); - открываем текстовый файл foto.txt для записи и присваиваем открытому файлу идентификатор $foto;
Fwrite($foto, Sfile. " ".$nadp.chr(l3).chr(10)); - делаем запись очередной строки. Сначала запишем название файла $file, затем при помощи точки (методом конкатенации) присоединяем символ-разделитель «|», после идет надпись под фотографией, хранящейся в переменной $nadp. В конец строки ставим известные уже вам два знака $chr(13) и chr(10), обозначающие переход на новую строку;
Fclose($foto); - закрываем текстовый файл;
Exit(); - после удачной записи в файл программа должна завершиться. Если мы не поставим здесь оператор exitQ, программа выполнит код ниже и выведет в браузер надписи, которые должны выводиться только в случае неудачной загрузки файла;
4} - завершение действия условия, проверяющего, был ли загружаемый файл уже загружен ранее;
3} - завершение действия условия, выполняющегося при удачной загрузке файла, т. е. при удачном копировании и сохранении загружаемого файла;
Else - если же загружаемый файл по каким-либо причинам не был загружен, то выполнится код в фигурных скобках под номером 5 (выведется сообщение
Об ошибке, и программа завершит работу); *{
Echo "Ошибка при закачке файла! Повторите попытку. <Ъг> "; exitQ;
2} - завершение действия условия, выполняющегося, если закачиваемый файл графический и имеет расширение jpg, gif или png (или с такими же расширениями, но из заглавных букв);
Else - если файл не графический или имеет другое расширение, то выполнится код в фигурных скобках под номером 6 (выведется сообщение, что расширение файла должно быть jpg, gif или png, и программа завершит работу);
Echo "Расширение закачиваемых файлов должно быть jpg, gif png, JPG, GIF, PNG! Повторите попытку. <br> "; exitQ; 6}
1} - окончание действия условия, выполняющегося, если элемент суперглобального массива SPOSTf'otpr'j определен, т. е. мы ввели данные в форму и нажали кнопку «Отправить»;
?> - окончание РНР-кода.
Пусть на диске вашего компьютера есть фото с названием img001.jpg. Запустите программу и попробуйте закачать этот графический файл. Нажмите кнопку «Обзор» (см. рис. 8.2) и в появившемся диалоговом окне выберите данный файл, нажав потом на кнопку «Открыть». Далее в текстовом иоле для надписи (подпись под фотографией) введите фразу «первое фото» и нажмите на кнопку «Отправить». Если файл будет удачно закачан, вы увидите об этом надпись с указанием размера закачанного файла (рис. 8.3).
Мои фотографии
Ш Отправить I - ----- 1 |
IllS Ifllfi! |
Закачать фото *- <■ ' - Д '
Обзор..
Подпись под фотографией
Вы увидите пока единственную строку с названием закачанного файла и надписью. Закройте текстовый файл, ничего в нем не меняя!
А теперь одно важное замечание! Естественно, вы будете закачивать в папку foto не одну фотографию. Название загружаемых файлов не должно состоять из русских букв, иначе они не распознаются рЬр-интерпретатором. Например, файл мое первое фото.]р% не загрузится в папку foto. Все загружаемые вами графические файлы должны иметь имена либо из латинских букв, либо из цифр (можно вперемежку с латинскими буквами). Поэтому, прежде чем загружать файлы, переименуйте их. Назовите их так: imgOOl, img002 и т. д. Обязательно сохраняйте цифровой порядок при закачке файлов, чтобы потом они выводились на вашей странице (ее мы составим в следующем листинге) в порядке возрастания цифр. Зачем? А чтобы при выводе ваших фото на страницу, не перепутались бы выведенные в браузер фотографии и надписи к ним! Итак, переименуйте свои фото так, как указано выше, и закачайте их в папку foto при помощи созданной выше программы ZagryzkaObych.php.