Лекция 1
Загрузка файлов на сервер
MIME
Некоторые MIME-типы
Некоторые MIME-типы
Некоторые MIME-типы
Причины появления MIME
Множественное содержимое
Множественное содержимое
Множественное содержимое
Атрибут enctype у форм
Атрибут enctype у форм
Multipart-формы
Поле для ввода файла
Общий вид формы загрузки файла
Обработка файла на сервере
Индексы массива $_FILES[‘myFile’]
Директивы конфигурационного файла php.ini
Перемещение временного файла
Скрипт загрузки файла
Загрузка нескольких файлов
Загрузка нескольких файлов
Функции для работы с файлами
Функция basename
Функция basename
Функция dirname
Функция realpath
Функция unlink
Функции прав доступа, групп и владельцев
Переменная $mode у функции chmod
Функция opendir()
Функция readdir()
Функция closedir()
Пример: открыть каталог, считать файлы
Результатом выполнения данного примера будет что-то подобное:
Объяснение сообщений об ошибках 
UPLOAD_ERR_OK
UPLOAD_ERR_INI_SIZE
UPLOAD_ERR_FORM_SIZE
UPLOAD_ERR_PARTIAL
UPLOAD_ERR_NO_FILE
UPLOAD_ERR_NO_TMP_DIR
UPLOAD_ERR_CANT_WRITE
UPLOAD_ERR_EXTENSION
Лабораторная работа
118.16K
Category: programmingprogramming

Загрузка файлов по протоколу HTTP

1. Лекция 1

Загрузка файлов по протоколу HTTP

2. Загрузка файлов на сервер

Загрузка файлов на сервер осуществляется
пользователями сети интернет довольно
часто:
• Веб-интерфейсы почтовых сервисов
• Интерактивные фотогалереи и
фотоальбомы
• Видеохостинги
• Файловые хостинги (файлообменники)

3. MIME

• MIME (произн. «майм», англ. Multipurpose Internet
Mail Extensions — многоцелевые расширения
интернет-почты) — спецификация для кодирования
информации и форматирования сообщений таким
образом, чтобы их можно было пересылать по
Интернету.
• Формат MIME поддерживает передачу нескольких
сущностей в пределах одного сообщения.
• Для обозначения множественного содержимого
используются медиатипы, обозначающие
составные типы данных: multipart/*.

4. Некоторые MIME-типы

Внутренний формат прикладной программы:
• application/json: JavaScript Object Notation JSON
• application/javascript: JavaScript
• application/octet-stream: двоичный файл без
указания формата
• application/ogg: Ogg
• application/pdf: Portable Document Format, PDF
• application/postscript: PostScript
• application/xhtml+xml: XHTML
• application/zip: ZIP
• application/x-gzip: Gzip

5. Некоторые MIME-типы

Аудио:
• audio/mp4: MP4
• audio/mpeg: MP3 или др. MPEG
• audio/ogg: Ogg Vorbis, Speex, Flac или др. аудио
• audio/vnd.wave: WAV
Видео:
• video/mpeg: MPEG-1
• video/mp4: MP4
• video/ogg: Ogg Theora или другое видео
• video/quicktime: QuickTime
• video/x-flv: FLV

6. Некоторые MIME-типы

Изображения:
• image/gif: GIF
• image/jpeg: JPEG
• image/pjpeg: JPEG
• image/png: Portable Network Graphics
• image/svg+xml: SVG
• image/tiff: TIFF

7. Причины появления MIME

MIME расширяет функционал электронной
почты (а впоследствии и протокола HTTP) для
поддержки:
• Текстовых данных в кодировках, отличных
от ASCII
• Не текстовых вложений
• Тел заголовков с множественным
содержимым

8. Множественное содержимое

• Множественное содержимое (Multipart
Content) – наличие больше одного типа
данных в едином теле запроса.
• Перед каждой порцией содержимого обязан
быть разделитель (boundary),
представляющий собой случайный набор
символов латиницы.
• Наименование разделителя указывается в
заголовке Content-Type в основном заголовке
запроса.

9. Множественное содержимое

Subject: = Тема письма
Content-Type: multipart/mixed;
boundary="----==--bound.402108.web37j.yandex.ru"
------==--bound.402108.web37j.yandex.ru
Content-Transfer-Encoding: 8bit
Content-Type: text/html; charset=utf-8
<div>Текст письма в HTML</div>
------==--bound.402108.web37j.yandex.ru
Content-Disposition: attachment;
filename=“notation.svg"
Content-Transfer-Encoding: base64
Content-Type: image/svg+xml;
name="notation.svg"
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2Zy
B4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhs
aW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5…

10. Множественное содержимое

POST /send-message.html HTTP/1.1
Host: webmail.example.com
Referer: http://webmail.example.com/sendmessage.html
User-Agent: BrowserForDummies/4.67b
Content-Type: multipart/form-data;
boundary=Asrf456BGe4h
Content-Length: (суммарный объём, включая
дочерние заголовки)
Connection: keep-alive
Keep-Alive: 300
(пустая строка)
(отсутствующая преамбула)
--Asrf456BGe4h
Content-Disposition: form-data; name="DestAddress"
(пустая строка)
[email protected]
--Asrf456BGe4h
Content-Disposition: form-data; name="MessageTitle"
(пустая строка)
Я негодую
--Asrf456BGe4h
Content-Disposition: form-data;
name="MessageText"
(пустая строка)
Привет, Василий! Твой ручной лев, которого
ты оставил у меня на прошлой неделе,
разодрал весь мой диван.
Пожалуйста забери его скорее!
Во вложении две фотки с последствиями.
--Asrf456BGe4h
Content-Disposition: form-data;
name="AttachedFile1"; filename="horror-photo1.jpg"
Content-Type: image/jpeg
(пустая строка)
(двоичное содержимое первой фотографии)
(отсутствующий эпилог - пустая строка)

11. Атрибут enctype у форм

• Определяет способ кодирования данных
формы при их отправке на сервер. Обычно
устанавливать значение атрибута enctype
не требуется. Однако если используется
поле для отправки файла (input type="file"),
следует определить атрибут enctype как
multipart/form-data.

12. Атрибут enctype у форм

• application/x-www-form-urlencoded
– Вместо пробелов ставится +, символы в
нестандартных кодировках (например на
кириллице) кодируются их шестнадцатеричными
значениями (например, %D0%90%D0%BD%D1%8F
вместо Аня).
• multipart/form-data
– Данные не кодируются. Это значение применяется
при отправке файлов.
• text/plain
– Пробелы заменяются знаком +, буквы и другие
символы не кодируются.

13. Multipart-формы

• Загрузка файлов на сервер осуществляется
с помощью multipart-формы, в которой есть
поле загрузки файла. В качестве атрибута
enctype указывается значение
multipart/form-data.

14. Поле для ввода файла

HTML-код поля для ввода имени файла,
который будет загружен на Web-сервер
выглядит так:
• <input type="file" name="myFile">
В браузере будет отображаться так:

15. Общий вид формы загрузки файла

<form action="upload.php" method="POST"
enctype="multipart/form-data">
<!—
Поле MAX_FILE_SIZE должно быть указано до поля загрузки
файла
-->
<input type="hidden" name="MAX_FILE_SIZE"
value="30000">
<!–
Название элемента input определяет имя в массиве $_FILES
-->
<input type="file" name="myFile">
<input type="submit" value="Загрузить">
</form>

16. Обработка файла на сервере

• PHP-интерпретатор, получив файл на
сервере, сохраняет его во временную
директорию (обычно /tmp, но зависит от
типа ОС и настроек PHP).
• Во временной директории файл хранится
под новым уникальным именем.
• После завершения работы скрипта,
временный файл будет удалён.

17. Индексы массива $_FILES[‘myFile’]

Для каждого файла в среде PHP создаётся глобальный массив
$_FILES[имя_файлового_поля], в котором существует 5 индексов.
• $_FILES['myFile']['name'] - имя файла до его отправки на сервер,
например, pict.gif;
• $_FILES['myFile']['size'] - размер принятого файла в байтах;
• $_FILES['myFile']['type'] - MIME-тип принятого файла (если браузер
смог его определить), например: image/gif, image/png, image/jpeg,
text/html;
• $_FILES['myFile']['tmp_name'] - содержит имя файла во временном
каталоге, например: /tmp/phpV3b3qY;
• $_FILES['myFile']['error'] - Код ошибки, которая может возникнуть
при загрузке файла. Ключ ['error'] был добавлен в PHP 4.2.0. С
соответствующими кодами ошибок вы можете ознакомиться здесь.

18. Директивы конфигурационного файла php.ini

Директивы конфигурационного
файла php.ini
• file_uploads - Разрешать или не разрешать закачивание файлов;
• upload_tmp_dir string - Временная директория, используемая
для хранения файлов во время закачивания. Должна быть
доступна для записи пользователю, от имени которого запущен
PHP. Если не указана, используется директория по умолчанию
для вашей системы;
• upload_max_filesize - Максимальный размер закачиваемого
файла;
• max_file_uploads - Максимально разрешенное количество
одновременно закачиваемых файлов;
• post_max_size - Устанавливает максимально допустимый
размер данных, отправляемых методом POST. Это значение
также влияет на загрузку файлов. Для загрузки больших файлов
это значение должно быть больше значения директивы
upload_max_filesize;

19. Перемещение временного файла

bool move_uploaded_file(string $filename,
string $destination)
• Функция проверяет, является ли файл
filename загруженным на сервер
(переданным по протоколу HTTP POST).
Если файл действительно загружен на
сервер, он будет перемещён в место,
указанное в аргументе destination.

20. Скрипт загрузки файла

<?php
$uploadfile =
dirname(__FILE__).”/”.basename($_FILES['myFile']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['myFile']['tmp_name'], $uploadfile)){
echo "Файл корректен и был успешно загружен.\n";
}
else{
echo "Возможная атака с помощью файловой загрузки!\n";
}
echo 'Некоторая отладочная информация:';
print_r($_FILES);
print "</pre>";
?>

21. Загрузка нескольких файлов

<form action="" method="post"
enctype="multipart/form-data">
<p>Изображения:
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="submit" value="Отправить" />
</p> </form>

22. Загрузка нескольких файлов

<?php
foreach
($_FILES["pictures"]["error"] as $key => $error)
{
if ($error == UPLOAD_ERR_OK)
{
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
$name = $_FILES["pictures"]["name"][$key];
move_uploaded_file($tmp_name, "data/$name");
}
}
?>

23. Функции для работы с файлами

ФУНКЦИИ ДЛЯ РАБОТЫ С
ФАЙЛАМИ

24. Функция basename

string basename ( string $path [, string $suffix ] )
• При передаче строки с путем к файлу или
каталогу, данная функция вернет
последний компонент имени из данного
пути.
• Если компонент имени заканчивается на
$suffix , то он также будет отброшен.

25. Функция basename

<?php
echo "1) ".basename("/etc/sudoers.d", ".d").PHP_EOL;
echo "2) ".basename("/etc/passwd").PHP_EOL;
echo "3) ".basename("/etc/").PHP_EOL;
echo "4) ".basename(".").PHP_EOL;
echo "5) ".basename("/");
?>
Результат выполнения:
1) sudoers
2) passwd
3) etc
4) .
5)

26. Функция dirname

string dirname ( string $path )
Получив строку, содержащую путь к файлу или
каталогу, функция возвратит родительский
каталог данного пути.
<?php
echo "1) " .
// 1) /etc
echo "2) " .
// 2) / (или
echo "3) " .
// 3) .
?>
dirname("/etc/passwd") . PHP_EOL;
dirname("/etc/") . PHP_EOL;
\ на Windows)
dirname(".");

27. Функция realpath

string realpath ( string $path )
Раскрывает все символические ссылки,
переходы типа '/./', '/../' и лишние символы '/' в
пути path, возвращая канонизированный
абсолютный путь к файлу.
<?php
chdir('/var/www/');
echo realpath('./../../etc/passwd');
?>
Результат:
/etc/passwd

28. Функция unlink

bool unlink (string $filename [, resource $contex
t])
Удаляет файл filename.
Возвращает TRUE в случае успешного завершения
или FALSE в случае возникновения ошибки.

29. Функции прав доступа, групп и владельцев

Функция
Назначение
bool chown ( string $filename,
mixed $user)
Осуществляет попытку изменения
владельца файла с именем filename
на владельца, чье имя передано в
параметре user (в виде числа или
строки). Только суперпользователь
может изменять владельца файла.
bool chgrp ( string $filename,
mixed $group )
Осуществляет попытку смены
группы файла filename на группу
group.
bool chmod ( string $filename , Осуществляет попытку изменения
режима доступа указанного файла
int $mode )
на режим, переданный в
параметре mode.

30. Переменная $mode у функции chmod

<?php
chmod("/somedir/somefile", 755);
// десятичное, скорее всего, указано
неверно
chmod("/somedir/somefile", "u+rwx,
go+rx");
// строка, неверный способ
chmod("/somedir/somefile", 0755);
// восьмеричное, верный способ
?>

31. Функция opendir()

resource opendir ( string $path
[, resource $context])
• Открывает дескриптор каталога для последующего
использования c
функциями closedir(), readdir() и rewinddir().
• Возвращает дескриптор каталога (resource) в случае
успеха или FALSE в случае ошибки.

32. Функция readdir()

string readdir ([ resource $dir_handle ] )
• Возвращает имя следующего по порядку элемента
каталога. Элементы возвращаются в том порядке, в
котором они хранятся в файловой системе.
• Возвращает имя элемента каталога в случае успеха или
FALSE в случае возникновения ошибки.
• Эта функция может возвращать как boolean FALSE, так и
не-boolean значение, которое приводится к FALSE.
Используйте оператор === для проверки значения,
возвращаемого этой функцией.

33. Функция closedir()

void closedir ([ resource $dir_handle ] )
• Закрывает поток, связанный с каталогом и переданный
в качестве параметра dir_handle. Перед
использованием данной функции, поток должен быть
открыт с помощью функции opendir().Возвращает имя
элемента каталога в случае успеха или FALSE в случае
возникновения ошибки.

34. Пример: открыть каталог, считать файлы

<?php
$dir = "/etc/php5/";
// Открыть известный каталог и начать считывать его содержимое
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
echo "файл: " . $file;
echo " тип: ". filetype($dir . $file) . "\n";
}
closedir($dh);
}
}
?>

35. Результатом выполнения данного примера будет что-то подобное:

файл:
файл:
файл:
файл:
файл:
. тип: dir
.. тип: dir
apache тип: dir
cgi тип: dir
cli тип: dir

36. Объяснение сообщений об ошибках 

Объяснение сообщений об ошибках
• PHP возвращает код ошибки наряду с
другими атрибутами принятого файла. Он
расположен в массиве, создаваемом PHP
при загрузке файла, и может быть получен
при обращении по ключу error. Другими
словами, код ошибки можно найти
в $_FILES['userfile']['error'].

37. UPLOAD_ERR_OK

• Значение: 0; Ошибок не возникло, файл
был успешно загружен на сервер.

38. UPLOAD_ERR_INI_SIZE

• Значение: 1; Размер принятого файла
превысил максимально допустимый
размер, который задан
директивой upload_max_filesize конфигурац
ионного файла php.ini.

39. UPLOAD_ERR_FORM_SIZE

• Значение: 2; Размер загружаемого файла
превысил значение MAX_FILE_SIZE,
указанное в HTML-форме.

40. UPLOAD_ERR_PARTIAL

• Значение: 3; Загружаемый файл был
получен только частично.

41. UPLOAD_ERR_NO_FILE

• Значение: 4; Файл не был загружен.

42. UPLOAD_ERR_NO_TMP_DIR

• Значение: 6; Отсутствует временная папка.
Добавлено в PHP 5.0.3.

43. UPLOAD_ERR_CANT_WRITE

• Значение: 7; Не удалось записать файл на
диск. Добавлено в PHP 5.1.0.

44. UPLOAD_ERR_EXTENSION

• Значение: 8; PHP-расширение остановило
загрузку файла. PHP не предоставляет
способа определить, какое расширение
остановило загрузку файла; в этом может
помочь просмотр списка загруженных
расширений с помощью phpinfo().
Добавлено в PHP 5.2.0.

45. Лабораторная работа

• 1. Написать скрипт, позволяющий загружать
несколько файлов в текущую директорию
на сервере. Выбрать MIME-тип
содержимого и максимальный размер.
• 2. Создать скрипт для вывода файлов на
экран с возможностью удаления любого
файла.
• 3. Предусмотреть защиту от взлома.
English     Русский Rules