Загрузка файлов на сервер
Пример формы:
Форма отправит файл только методом POST и с атрибутом enctype="multipart/form-data".
<form action="/upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="Отправить"> </form>
Форма для загрузки сразу нескольких файлов:
<form action="/upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="file[]" multiple> <input type="submit" value="Отправить"> </form>
Файл upload.php:
- Поддерживает как одиночную загрузку файла так и множественную (multiple) без изменения кода.
- Проверка на все возможные ошибки которые могут возникнуть при загрузке файлов.
- Имена файлов переводятся в транслит и удаляются символы которые будут в дальнейшем мешать вывести их на сайте.
- Есть возможность указать разрешенные и запрещенные для загрузки расширения файлов.
// Название <input type="file"> $input_name = 'file'; // Разрешенные расширения файлов. $allow = array(); // Запрещенные расширения файлов. $deny = array( 'phtml', 'php', 'php3', 'php4', 'php5', 'php6', 'php7', 'phps', 'cgi', 'pl', 'asp', 'aspx', 'shtml', 'shtm', 'htaccess', 'htpasswd', 'ini', 'log', 'sh', 'js', 'html', 'htm', 'css', 'sql', 'spl', 'scgi', 'fcgi' ); // Директория куда будут загружаться файлы. $path = __DIR__ . '/uploads/'; if (isset($_FILES[$input_name])) { // Проверим директорию для загрузки. if (!is_dir($path)) { mkdir($path, 0777, true); } // Преобразуем массив $_FILES в удобный вид для перебора в foreach. $files = array(); $diff = count($_FILES[$input_name]) - count($_FILES[$input_name], COUNT_RECURSIVE); if ($diff == 0) { $files = array($_FILES[$input_name]); } else { foreach($_FILES[$input_name] as $k => $l) { foreach($l as $i => $v) { $files[$i][$k] = $v; } } } foreach ($files as $file) { $error = $success = ''; // Проверим на ошибки загрузки. if (!empty($file['error']) || empty($file['tmp_name'])) { switch (@$file['error']) { case 1: case 2: $error = 'Превышен размер загружаемого файла.'; break; case 3: $error = 'Файл был получен только частично.'; break; case 4: $error = 'Файл не был загружен.'; break; case 6: $error = 'Файл не загружен - отсутствует временная директория.'; break; case 7: $error = 'Не удалось записать файл на диск.'; break; case 8: $error = 'PHP-расширение остановило загрузку файла.'; break; case 9: $error = 'Файл не был загружен - директория не существует.'; break; case 10: $error = 'Превышен максимально допустимый размер файла.'; break; case 11: $error = 'Данный тип файла запрещен.'; break; case 12: $error = 'Ошибка при копировании файла.'; break; default: $error = 'Файл не был загружен - неизвестная ошибка.'; break; } } elseif ($file['tmp_name'] == 'none' || !is_uploaded_file($file['tmp_name'])) { $error = 'Не удалось загрузить файл.'; } else { // Оставляем в имени файла только буквы, цифры и некоторые символы. $pattern = "[^a-zа-яё0-9,~!@#%^-_$?(){}[].]"; $name = mb_eregi_replace($pattern, '-', $file['name']); $name = mb_ereg_replace('[-]+', '-', $name); // Т.к. есть проблема с кириллицей в названиях файлов (файлы становятся недоступны). // Сделаем их транслит: $converter = array( 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ь' => '', 'ы' => 'y', 'ъ' => '', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'E', 'Ж' => 'Zh', 'З' => 'Z', 'И' => 'I', 'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sch', 'Ь' => '', 'Ы' => 'Y', 'Ъ' => '', 'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya', ); $name = strtr($name, $converter); $parts = pathinfo($name); if (empty($name) || empty($parts['extension'])) { $error = 'Недопустимое тип файла'; } elseif (!empty($allow) && !in_array(strtolower($parts['extension']), $allow)) { $error = 'Недопустимый тип файла'; } elseif (!empty($deny) && in_array(strtolower($parts['extension']), $deny)) { $error = 'Недопустимый тип файла'; } else { // Чтобы не затереть файл с таким же названием, добавим префикс. $i = 0; $prefix = ''; while (is_file($path . $parts['filename'] . $prefix . '.' . $parts['extension'])) { $prefix = '(' . ++$i . ')'; } $name = $parts['filename'] . $prefix . '.' . $parts['extension']; // Перемещаем файл в директорию. if (move_uploaded_file($file['tmp_name'], $path . $name)) { // Далее можно сохранить название файла в БД и т.п. $success = 'Файл «' . $name . '» успешно загружен.'; } else { $error = 'Не удалось загрузить файл.'; } } } // Выводим сообщение о результате загрузки. if (!empty($success)) { echo '<p>' . $success . '</p>'; } else { echo '<p>' . $error . '</p>'; } } }
Загрузка файлов через AJAX
Содержание
- 1 Загрузка файлов через AJAX
- 2 Возможные проблемы
- 3 Требования перед загрузкой файлов
- 4 Этапы загрузки файла на сервер
- 5 Добавляем HTML форму для загрузки файла
- 6 Переходим на сервере и работаем с PHP
- 7 Вопросы безопасности
- 8 Подводим итоги и делаем выводы
- 9 Простая загрузка файла на сервер при помощи PHP
- 10 Загрузка файлов на сервер на php. Введение
- 11 Загрузка файлов в php. Код
- 12 HTML-форма для отправки файла
- 13 Массив $_FILES
- 14 Функция move_uploaded_file
- 15 Функция is_uploaded_file
- 16 Ограничиваем размер файла
- 17 Настройки php.ini для загрузки файлов на сервер
Файлы можно отправить без перезагрузки страницы с помощью jQuery Form Plugin.
Как это работает:
- На поле выбора файла с id="js-file" повешено jquery событие change.
- При выборе файла срабатывает событие и выполняется метод плагина ajaxSubmit, он все поля из формы с id="js-form" включая выбранный файл отправляет на uploads.php.
- Далее то что отдаст uploads.php выведется в <div id="result">…</div>.
- После завершения, форма очищается методом reset() т.к. input file останется с выбранным файлом.
<form id="js-form" method="post" enctype="multipart/form-data"> <input id="js-file" type="file" name="file[]" multiple> </form> <div id="result"> <!-- Сюда выводится результат из uploads.php --> </div> <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="//malsup.github.io/min/jquery.form.min.js"></script> <script> $('#js-file').change(function() { $('#js-form').ajaxSubmit({ type: 'POST', url: '/upload.php', target: '#result', success: function() { // После загрузки файла очистим форму. $('#js-form')[0].reset(); } }); }); </script>
Возможные проблемы
- На unix хостингах php функция move_uploaded_file() не будут перемещать файлы в директорию если у нее права меньше 777.
- Загрузка файлов может быть отключена в настройках PHP директивой file_uploads.
- Не загружаются файлы большого размера, причина в ограничениях хостинга.
Посмотрите в phpinfo() значения директив:- upload_max_filesize – максимальный размер закачиваемого файла.
- max_file_uploads – максимальное количество одновременно закачиваемых файлов.
- post_max_size – максимально допустимый размер данных, отправляемых методом POST, его значение должно быть больше upload_max_filesize.
- memory_limit – значение должно быть больше чем post_max_size.
snipp.ru
Требования перед загрузкой файлов
Обработка загружаемых файлов — стандартный процесс, но существует несколько мелочей, на которые необходимо обратить внимание перед началом работы. Первое, в чем нужно удостовериться, что PHP настроен и позволяет загружать файлы. Для этого в php.ini стоит проверить директиву file_uploads
, и, если она выключена, то включить.
file_uploads = On
Загружаемые файлы сначала сохраняются во временном каталоге (но не волнуйтесь … ваш PHP-скрипт впоследствии может переместить файлы в более подходящее место). Исходное местоположение является временным каталогом для системы по умолчанию. Вы можете указать другой каталог, используя директиву upload_tmp_dir
в php.ini. Независимо от этого, будет не лишним проверить, что процесс PHP имеет правильные права на запись в зависимости от используемого каталога.
upload_tmp_dir = "/tmp" tboronczyk@zarkov:~$ ls -l / | grep tmp drwxrwxrwt 13 root root 40960 2011-08-31 00:50 tmp
После того, как вы уверены, что конфигурация позволяет серверу принимать загруженные файлы, вы можете сосредоточить свое внимание на деталях и добавить HTML форму. Крайне важно, чтобы ваш элемент <form>
использовал метод POST и имел атрибут enctype
, установленный для multipart/form-data
.
<form action="upload.php" method="post" enctype="multipart/form-data">
Этапы загрузки файла на сервер
Скорей всего, вы уже можете представить, как загружаются файлы на сервер, основываясь на собственном опыте и требованиях о которых я упомянул выше.
- Посетитель просматривает HTML-страницу с формой, специально написанной для поддержки загрузки файлов;
- Далее он предоставляет файл, который он хочет загрузить и нажимает кнопку отправить;
- Браузер кодирует файл и отправляет его как часть запроса POST;
- PHP получает форму отправки, декодирует файл и сохраняет его во временном месте на сервере;
- Написанный PHP-скрипт, ответственный за обработку сообщения формы, проверяет файл и обрабатывает его каким-то образом, часто перемещая его из своего временного местоположения в постоянное, где будет храниться файл.
Для добавления поддержки загрузки файлов вам необходимо создать HTML форму, которая будет представлена пользователю, и скрипт PHP, который позаботится о загруженном файле на сервере.
Добавляем HTML форму для загрузки файла
HTML-формы предоставляют собой интерфейс, через который пользователь инициирует загрузку файла. Нужно помнить, что элемент <form>
должен иметь свой атрибут метода, установленный для публикации, и его атрибут enctype
, заданный для multipart/form-data
. Элемент <input>
файла предоставляет поле, используемое для указания файла, который будет загружен. Как и любой другой элемент формы, важно указать атрибут имени, чтобы вы могли ссылаться на него в PHP скрипте, обрабатывающем форму.
Вот как выглядит типичная разметка формы загрузки файлов:
<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="myFile"> <br> <input type="submit" value="Upload"> </form>
Стоит отметить, что разные браузеры будут визуализировать поле загрузки файла по-разному. IE, Firefox и Opera отображают его как текстовое поле с кнопкой рядом с ней надписью «Обзор» или «Выбрать». Safari отображает ее так же, как кнопку с надписью: «Выбрать файл». По большому счету это не проблема с тех пор, как пользователи привыкли к тому, как поле отображается в своем браузере и умеют его использовать. Иногда, однако, вы столкнетесь с клиентом или дизайнером, который непреклонно представляет его определенным образом. Количество CSS и JavaScript, которые могут применяться к файловому полю, крайне ограничено из-за соображений о безопасности, наложенных браузерами. Типизация файла может быть затруднена. Если внешний вид очень важен для вас, я рекомендую вам прочитать одну из статей «Питер-Пол Кох» типа ввода = «файл».
Переходим на сервере и работаем с PHP
Информация о загрузке файла предоставляется с помощью многомерного массива $_FILES
. Этот массив обладает своей структурой, назначенными именами для полей файла в форме HTML, точно так же, как и при работе с $_GET
и $_POST
. Затем массив каждого файла содержит следующие элементы:
$_FILES["myFile"]["name"]
— хранит исходное имя файла;$_FILES["myFile"]["type"]
— сохраняет mime-типа файла;$_FILES["myFile"]["size"]
— сохраняет размер файла (в байтах);$_FILES["myFile"]["tmp_name"]
— хранит имя временного файла;$_FILES["myFile"]["error"]
— хранит код ошибки, полученный в результате передачи.
При помощи функции move_uploaded_file()
мы можем перенести файл из своего временного каталога в постоянное место. Так же хорошей практикой является использовать именно её вместо copy()
и rename()
для этой цели, поскольку она выполняет дополнительные проверки, чтобы гарантировать, что файл был действительно загружен запросом HTTP методом POST.
Если вы собираетесь сохранить файл с исходным именем, предоставленным пользователем, рекомендуется убедиться, что это безопасно. Имя файла не должно содержать символов, которые могут повлиять на путь назначения, например, косая черта (слэш). Имя файла должно быть уникальным, чтоб избежать затирания существующих с тем же именем (если это не предусматривается вашим приложением). Гарантировать это можно заменяя любые символы символом подчеркивания, который не является буквой, а затем добавляя увеличивающийся номер, если файл с таким именем уже существует.
Вот так как выглядит получение и обработка загрузки файла при помощи PHP:
define("UPLOAD_DIR", "/srv/www/uploads/"); if (!empty($_FILES["myFile"])) { $myFile = $_FILES["myFile"]; if ($myFile["error"] !== UPLOAD_ERR_OK) { echo "<p>Произошла ошибка.</p>"; exit; } // обеспечиваем безопасное имени файла $name = preg_replace("/[^A-Z0-9._-]/i", "_", $myFile["name"]); // не перезаписываем существующий файл $i = 0; $parts = pathinfo($name); while (file_exists(UPLOAD_DIR . $name)) { $i++; $name = $parts["filename"] . "-" . $i . "." . $parts["extension"]; } // сохраняем файл из временного каталога $success = move_uploaded_file($myFile["tmp_name"], UPLOAD_DIR . $name); if (!$success) { echo "<p>Не удалось сохранить файл.</p>"; exit; } // устанавливаем правильные права для нового файла chmod(UPLOAD_DIR . $name, 0644); }
Сначала мы удостоверяемся, что PHP загрузка файла на сервер прошла без ошибок. Затем определяем безопасное имя файла, как я только что описал выше, а затем перемещаем файл в его конечный каталог с помощью move_uploaded_file()
. И наконец делаем вызов chmod()
, чтобы убедиться, что в новом файле установлены необходимые права доступа.
Вопросы безопасности
Вы бы позволили совершенно незнакомым людям хранить файлы на наших персональных компьютерах? Не думаю так, и все же это именно то, что вы делаете, когда разрешаете загрузку файлов в вашем приложении. Вы можете намереваться загрузить изображение пользователя для страницы профиля, но что, если он попытается загрузить специально созданный, наполненный вирусами исполняемый файл? Я хотел бы поделиться несколькими шагами, которые вы можете предпринять, чтобы минимизировать риски безопасности, связанные с возможностью загрузки файлов.
Один из них заключается в том, чтобы проверить тип загружаемого файла, каким он должен быть. Опираться на значение $_FILES["myFile"]["type"]
или на расширение имени файла не является безопасным, поскольку оба могут легко подделываться. Скорее, используйте функцию exif_imagetype()
, чтобы проверить содержимое файла и определить, действительно ли это GIF, JPEG или один из нескольких других поддерживаемых форматов изображений. Если exif_imagetype()
недоступен (функция требует, чтобы расширение Exif было включено), вы можете использовать getimagesize()
. Массив, возвращаемый ей, будет содержать тип изображения, если он распознан.
// проверяем файл GIF, JPEG или PNG $fileType = exif_imagetype($_FILES["myFile"]["tmp_name"]); $allowed = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG); if (!in_array($fileType, $allowed)) { // тип файла не разрешен ...
Для файлов без изображения вы можете использовать exec()
для вызова утилиты файлов unix. он определяет тип файла, ища известные двоичные подписи в ожидаемых местах.
// проверяем файл в формате PDF $mime = "application/pdf; charset=binary"; exec("file -bi " . $_FILES["myFile"]["tmp_name"], $out); if ($out[0] != $mime) { // файл не PDF ...
Еще один шаг, который вы можете предпринять, — наложить жесткие ограничения на общий размер запроса POST и количество файлов, которые можно загрузить. Для этого укажите соответствующее значение для директив upload_max_size
, post_max_size
и max_file_uploads
в php.ini. Директива upload_max_size указывает максимальный размер загрузки файла. В дополнение к размеру загрузки вы можете ограничить размер всего запроса POST директивой post_max_size
. max_file_uploads
— это новая директива (добавлена в версии 5.2.12), которая ограничивает количество загрузок файлов. Эти три директивы помогают защитить ваш сайт от атак, которые пытаются нарушить его доступность, вызывая интенсивный сетевой трафик или загрузку системы.
post_max_size = 8M upload_max_size = 2M max_file_uploads = 20
Третий шаг, который вы можете предпринять для минимизации риска, — это сканирование загруженных файлов с помощью антивирусного сканера. Это жизненно важно для защиты от распространённых вирусов и вредоносных программ, особенно если ваш сайт осуществляет файлообмен между разными людьми, как пример — вложения в веб-почтовый клиент или (юридический) сайт для обмена файлами. Существует расширение PHP, которое обеспечивает доступ к ClamAV, но, конечно, вы можете вызвать утилиту командной строки ClamAV так же, как я продемонстрировал для файла.
exec("clamscan --stdout " . $_FILES["myFile"]["tmp_name"], $out, $return); if ($return) { // файл заражен ...
Подводим итоги и делаем выводы
Сегодня вы узнали, как происходит настройка и осуществляется процесс PHP загрузки файлов на сервер с вашего сайта или веб-приложения. Чтобы загрузка была успешной, форма HTML должна быть отправлена через запрос POST с множественным форматированием данных, а PHP должен разрешать передачу, как указано, с помощью директивы file_uploads
. После переноса файла, сценарий, ответственный за обработку загрузки, использует информацию, найденную в массиве $_FILES
, чтобы переместить файл из временного каталога в нужное место. Я также поделился некоторыми дополнительными мерами предосторожности, которые вы можете предпринять, чтобы защитить себя и своих пользователей от некоторых рисков, связанных с возможностью загрузки файлов. Чтобы гарантировать свою безопасность — проверяйте тип файла, наложите жесткие ограничения на загрузку трафика и применяйте сканирование на наличие вирусов.
Для тех, кто может быть заинтересован, дополнительный код для этой статьи доступен на GitHub. Вы можете просматривать, загружать или клонировать репозиторий и играть с кодом, чтобы лучше понять, как работает процесс загрузки файлов.
falbar.ru
Простая загрузка файла на сервер при помощи PHP
Вам не составит труда написать собственный PHP-скрипт для загрузки файлов на сервер. Прежде всего, нужно создать HTML-форму с полем file input. Затем привязать к ней PHP-скрипт, который переместит файл в указанную директорию. Чтобы закачать файл на сервер с помощью PHP-скрипта, выполните следующие действия:
- Создайте простую HTML-форму: потребуется простая форма с возможностью указания файла. Она размещается в файле basic.php:
Приведенный выше код необходим для создания формы. Как только пользователь выбирает файл и нажимает кнопку Upload, форма передаст данные с помощью метода POST на этой же странице, так как в качестве обработчика указан файл basic.php:
Важно: не забудьте добавить enctype=”multipart/form-data” в тег <form>.
- Создаем PHP-скрипт для обработки формы загрузки. В PHP вся информация о загруженных файлах содержится в глобальной переменной $_FILES. То есть, используя $_FILES, можно проверить, был ли загружен файл. Если файл был загружен, то можно переместить его в нужную директорию при помощи функции move_uploaded_file PHP:
Приведенный выше код проверяет, загрузил ли пользователь файл. Если файл загружен, то мы перемещаем файл в указанную директорию. В приведенном выше скрипте мы перемещаем файл в ту же папку, где находится файл basic.php.
Ниже приведена полная версия PHP move uploaded file примера:
Пожалуйста, не тестируйте этот PHP move uploaded file пример на сервере. Он не отвечает требованиям безопасности, и был создан специально для того, чтобы наглядно показать, как загружать файлы с помощью PHP.
Вопрос: Почему приведенный выше скрипт небезопасен?
Ответ: С помощью скрипта, приведенного выше, можно загрузить файл любого типа на сервер. То есть, если вы используете скрипт в таком виде на “живом” сервере, то любой хакер сможет загрузить собственные PHP-скрипты, и взломать ваш сайт и сервер.
Чуть позже мы подробнее поговорим о защите скрипта для загрузки файлов на сервер.
Что такое $_FILES?
$_FILES – это глобальная переменная в PHP наподобие $_POST или $_GET. Она представляет собой ассоциативный массив, в котором находится информация о загруженном файле с помощью метода HTTP POST.
То есть, если выполнить print_r($_FILES) для приведенного выше скрипта, то мы получим следующую информацию:
То есть, для каждого поля <input type=”file” name=”inputfile“/> в массиве создается элемент. Если вы создадите <input type=”file” name=”test”>, то название элемента также будет изменено на test. Например:
Теперь для каждого input file, перемещаемого с помощью move uploaded file PHP, создается пять элементов (name, type, tmp_name, error, size). Давайте познакомимся с этими элементами поближе:
- name: содержит название загруженного пользователем файла. Если вы загрузите файл abc.txt в браузер, то элемент name получит название abc.txt;
- type: тип загруженного файла или mime-type, если точнее. Для файла JPG этот элемент будет иметь значение image/jpeg. Если загрузить текст, то элемент получит значение text/plain. Для разных типов файлов разным будет и mime-type. Ниже приведены самые распространенные mime-типы:
- JPEG: image/jpeg;
- PNG: image/png;
- Текст: text/plain;
- Word: application/msword.
- tmp_name: временное расположение для загруженного файла. Этот путь можно изменить в переменной upload_tmp_dir, указанной в файле php.ini.
- error: информация об ошибке. Включает в себя тип ошибки, возникшей в процессе загрузки. Например, когда размер файла превышает максимальный или когда не был указан файл для загрузки. Для любой возникшей ошибки имеется числовое значение и константа. Ниже приведен полный список ошибок, которые могут возникнуть в PHP move uploaded file примере:
- UPLOAD_ERR_OK (значение 0). Означает, что файл был успешно загружен без ошибок;
- UPLOAD_ERR_INI_SIZE (значение 1). Размер файла превышает указанный в переменной upload_max_filesize в файле php.ini;
- UPLOAD_ERR_FORM_SIZE (значение 2). Размер файла превышает установленное в переменной формы MAX_FILE_SIZE значение;
- UPLOAD_ERR_PARTIAL (значение 3). Файл загружен не полностью;
- UPLOAD_ERR_NO_FILE (значение 4). Отсутствует файл для загрузки;
- UPLOAD_ERR_NO_TMP_DIR (значение 6). Указанной директории для временного хранения не существует;
- UPLOAD_ERR_CANT_WRITE (значение 7). Невозможно записать файл на диск.
- size: размер загруженного файла в байтах.
Что такое move_uploaded_file?
move_uploaded_file представляет собой функцию, которая перемещает загруженный файл из временной директории в папку назначения. Перед перемещением move_uploaded_file PHP проверяет, был ли загружен файл, указанный в HTTP-методе post.
Если файл был успешно перемещен, то вы получите ответ true или false. В первом примере мы использовали следующую строку кода:
А теперь давайте сделаем красиво, и выведем информацию:
Изменяем лимит размера загружаемого файла
У каждой формы для загрузки файлов должен быть установлен лимит размера, иначе пользователи станут загружать увесистые файлы. Выставить ограничение на move uploaded file PHP можно двумя способами:
- В файле PHP.ini есть специальная переменная upload_max_filesize, которая отвечает за максимальный размер загружаемых файлов. Далее приведена строчка из php.ini, которая ограничивает размер загружаемых файлов до 20 Мб: upload_max_filesize = 20M.
- Если загружаемый файл будет иметь больший размер, то пользователь получит ошибку UPLOAD_ERR_INI_SIZE или значение «2» в переменной $_FILES. Важно учесть, что значение переменной upload_max_filesize не должно превышать значение переменной post_max_size, указанной в php.ini;
- Ограничить размер загружаемого файла можно, поместив скрытый элемент ввода с названием UPLOAD_ERR_INI_SIZE в форму загрузки. Сделать это можно так: <input type="hidden" name="MAX_FILE_SIZE" value="50000" />.
Если нужно сильно увеличить filesize, то не забудьте изменить время исполнения php-скриптов.
Как обезопасить PHP-скрипт загрузки файлов
Теперь вы умеете ограничивать размер загружаемых файлов и знаете, как определить типы файлов, которые загружают пользователи. Пришло время позаботиться о безопасности нашего PHP move uploaded file примера.
В качестве примера сделаем так, чтобы пользователи не могли загружать jpeg-файлы размером свыше 1 Мб. Установите соответствующее ограничение в переменной upload_max_filesize файла php.ini. Ниже приведена улучшенная версия скрипта:
Мультизагрузка файлов при помощи PHP-скрипта
Можно загружать сразу несколько файлов при помощи $_FILES и move_uploaded_file PHP. Ниже я расскажу вам о двух способах мультизагрузки файлов с помощью PHP-скрипта:
- Используя разные имена Input.
- Используя одно и то же имя input, но с привлечением массива.
1. Используя разные имена Input:
Можно загружать сразу несколько файлов, используя несколько элементов ввода. Как уже говорилось ранее, если мы создаем несколько элементов input, то в $_FILES будет создано несколько основных элементов. Например, для приведенной ниже формы:
$_FILES представит массив следующего содержания:
Приведенный ниже PHP move uploaded file пример нужно писать с учетом того, что один элемент предназначен для аватарки (изображение), а другой – для загрузки резюме (файла в формате .doc):
2. Используем одно поле input, но с применением массива:
Как и в случае с другими типами input, для move uploaded file PHP мы можем использовать массив с input type, указанным в php. То есть:
То есть, для приведенного выше HTML, $_FILES предоставит данные со следующей структурой:
Скачать код, использованный в статье
Перевод статьи “File Upload With PHP Script” был подготовлен дружной командой проекта Сайтостроение от А до Я.
www.internet-technologies.ru
Наверняка, Вы часто загружали различные файлы на сайты. Например, загружали аватары на форуме, фотографии в социальных сетях, различные видеоролики на видеохостинги, просто файлы на файлообменники. И вот в этой статье Вы узнаете, как загрузить файлы на сервер в PHP. Именно через PHP в большинстве случаев это и реализуют.
Первым делом, что нужно усвоить — это то, что сама HTML-форма, в которую подставляется файл должна быть не совсем обычной, вот пример HTML-кода такой формы:
<form action = "loading.php" method = "post" enctype = 'multipart/form-data'>
<input type = "file" name = "somename" />
<input type = "submit" value = "Загрузить" />
</form>
Ключевой момент здесь — это атрибут «enctype» со значением «multipart/form-data«. Без него ничего работать не будет.
Теперь пишем скрипт «loading.php«, в котором мы ещё загружать файл не будем, а пройдёмся немного по различным важным моментам, которые надо обязательно учитывать, иначе может пострадать безопасность:
<?php
print_r($_FILES);
?>
В результате, Вы увидите содержимое глобального двумерного массива $_FILES:
- name — имя загружаемого файла.
- type — MIME-type загружаемого файла. Это, пожалуй, самый важный параметр для обеспечения безопасности. И всегда при приёме файлов необходимо проверять MIME-type, иначе проблем не оберётесь. В следующей статье мы поговорим об этом более детально.
- tmp_name — физический путь к временному файлу. Именно в это место и помещается файл, а уже потом мы его переносим в другое место. Фактически, файл уже загружен, а нам лишь надо его переместить в нужную папку на сервере.
- error — код ошибки. Если 0, то ошибок нет.
- size — размер загружаемого файла. Вот это тоже частоиспользуемая опция, и её также надо проверять, чтобы ограничить размер загружаемых файлов. Безусловно, самим сервером этот размер ограничен, однако, для всяких картинок, этот размер явно завышен (как правило, он 10 МБ).
И все эти параметры присутствуют для каждого загружаемого файла (каждые из которых представляют собой массив в двумерном массиве $_FILES).
Теперь давайте уже закончим с загрузкой файлов на сервер в PHP, и для этого напишем такой код («loading.php«):
<?php
$uploadfile = "images/".$_FILES['somename']['name'];
move_uploaded_file($_FILES['somename']['tmp_name'], $uploadfile);
?>
То есть вначале мы задаём путь к загружаемому файлу на сервере. Здесь мы хотим поместить файл в директорию «images» с тем же именем, что и было раньше у файла. А функцией move_uploaded_file() мы перемещаем файл в выбранную нами директорию из его временного хранилища.
Однако, обратите внимание, это очень важно! Так использовать код ни в коем случае нельзя, иначе Вашему сайту будет угрожать серьёзная опасность! Фактически, на данный момент может быть загружено абсолютно всё, что угодно: любые исполняемые файлы, скрипты, HTML-страницы и другие весьма опасные вещи. Поэтому обязательно надо проверять загружаемые файлы на сервер очень тщательно. И вот этим мы и займёмся в следующей статье. Поскольку тема очень важная, то я советую Вам подписаться на обновления, чтобы не пропустить эту статью.
myrusakov.ru
Загрузка файлов на сервер на php. Введение
В этой статье я хочу показать как можно быстро и просто реализовать загрузку файлов на сервер с помощью php с проверками файла на размер и на формат. Эта тема хоть и простая и очень распространенная, все же по ней тоже часто возникают вопросы у программистов новичков.
Чтобы передать какие-либо данные из браузера на сервер необходимо на странице создать html-форму:
<form action="/form/index.php" method="POST" enctype="multipart/form-data"> <input type="file" name="upload_file"><br> <input type="submit" value="Загрузить"><br> </form>
В которой будет указан путь к скрипту на сервере, куда будут отправлены данные, в данном случае это /form/index.php. Также указывается метод передачи данных — POST или GET. И необходимо указать тип передаваемых данных, чтобы передавать файлы, тип должен быть multipart/form-data.
Когда сама форма готова, внутри нее следует создать input и типом file, в него пользователь сможет загрузить файл, для последующей отправки на сервер.
Далее начинается самое интересное — получение и обработка данных на сервере. Все данные о файле будет храниться в суперглобальной переменной $_FILE. Поэтому первым делом на сервере необходимо проверить — существует эта переменная или нет. В случае существования, мы можем проверить размер файла, получить его имя, расширение и путь к нему, файл будет хранится во временных файлах.
Загрузка файлов в php. Код
Сперва сверстаем небольшую форму и добавим условия, при которых будет отображаться сообщения об успешной отправке файла или об случившихся ошибках:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <br/> <?php if(!empty($error_array)): ?> <span style="color: red;">Файл не загружен!</span><br/> <?php foreach($error_array as $one_error): ?> <span style="color: red;"><?=$one_error;?></span><br/> <?php endforeach; ?> <?php endif; ?> <?php if(empty($error_array) AND $_FILES): ?> <span style="color: green;">Файл успешно загружен!</span><br/> <?php endif; ?> <form action="/form/index.php" method="POST" enctype="multipart/form-data"> <input type="file" name="upload_file"><br> <input type="submit" value="Загрузить"><br> </form> </body> </html>
Теперь напишем серверный скрипт, который будет проверять размер и формат файла, а так же в случае корректных данных будет сохранять файл на сервере.
<?php // ограничение размера файла $limit_size = 1*1024*1024; // 1 Mb // корректные форматы файлов $valid_format = array("jpeg", "jpg", "gif", "png"); // хранилище ошибок $error_array = array(); // путь до нового файла $path_file = "files/"; // имя нового файла $rand_name = md5(time() . mt_rand(0, 9999)); // если есть отправленные файлы if($_FILES){ // валидация размера файла if($_FILES["upload_file"]["size"] > $limit_size){ $error_array[] = "Размер файла превышает допустимый!"; } // валидация формата файла $format = end(explode(".", $_FILES["upload_file"]["name"])); if(!in_array($format, $valid_format)){ $error_array[] = "Формат файла не допустимый!"; } // если не было ошибок if(empty($error_array)){ // проверяем загружен ли файл if(is_uploaded_file($_FILES["upload_file"]["tmp_name"])){ // сохраняем файл move_uploaded_file($_FILES["upload_file"]["tmp_name"], $path_file . $rand_name . ".$format"); }else{ // Если файл не загрузился $error_array[] = "Ошибка загрузки!"; } } } ?>
На этом все, исходники формы для загрузки файлов на php, вы можете скачать — тут.
vk-book.ru
HTML-форма для отправки файла
Первое, что нужно знать для загрузка файлов на сервер — это особенности HTML-форм, которые отправляют файл.
Вот пример HTML-кода такой формы:
<html> <head> <title>Загрузка файлов на сервер</title> </head> <body> <h2>Форма для загрузки файлов</h2> <!-- Поле MAX_FILE_SIZE должно быть указано до поля загрузки файла --> <input type="hidden" name="MAX_FILE_SIZE" value="30000"> <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="filename"><br> <input type="submit" value="Загрузить"><br> </form> </body> </html>
Что уникального в этой форме:
- Тег
form
должен обязательно содержать атрибутenctype="multipart/form-data
. Именноо этот атрибут указывает на то, что форма будет передавать файл. По умолчанию атрибутenctype
имеет значениеapplication/x-www-form-urlencoded
. - Форма должна содержать скрытый атрибут (
type="hidden"
) с именемMAX_FILE_SIZE
в значении которого (value
) указывается размер файла. Теоретически, браузеры должны сообщать о том, что файл превышает допустимые размеры, но на практике браузеры не поддерживают это. Я думаю, что этот атрибут можно не указывать. - Для выбора передаваемого файла служит тег
input
, у которого атрибутtype="file"
.
После того, как сервер получил HTTP-запрос от такой формы, он записывает файл во временную папку на сервере.
Если хотите чтобы файл на этом этапе сохранялся в другой каталог, укажите его в директиве upload_tmp_dir
файла php.ini.
Для перемещения загруженного файла в новое место используется функция move_uploaded_file
.
Но перед тем, как начать работать с этой функцией, мы должны изучить двумерный массив $_FILES
, через который мы получаем доступ к характеристикам загруженного файла.