Молодогвардейцев 454015 Россия, Челябинская область, город Челябинск 89085842764
MindHalls logo

Загрузка файла через форму на PHP

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

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

HTML форма для загрузки файла

Первым делом построим самую простую форму с двумя полями: специальное поле для загрузки файла(input type=file), и кнопка «отправить». Методом отправки данных будет POST. Кроме того, необходимо указать способ кодирования данных при отправке, с помощью атрибута ecntype.

<form enctype="multipart/form-data" method="post">
    Файл: <input type="file" name="file">
    <input type="submit" name="submintbut" value="Отправить">
</form>

Способ кодирования выставлен в multipart/form-data, это говорит о том, что данные кодироваться не будут, и будут отправлены в своем первоначальном виде. Такой способ используется только для загрузки файлов.

Обработка формы загрузки файла на PHP

После того, как сервер принял POST данные из формы, должен отработать скрипт по их обработке. Совершенно неважно, где скрипт будет написан, в моем примере его можно поместить в HTML документ с формой. Нам понадобится одна единственная функция move_uploaded_file, которая переместит файл из временного хранилища на сервере(первый аргумент) по адресу, указанному во втором аргументе, тем самым завершив загрузку.

Информация о загруженных через POST файлах хранится в специальном суперглобальном ассоциативном массиве $_FILES. К конкретному файлу можно обратиться по имени формы, в нашем случае $_FILES[‘file’].

Доступная информация о файле:
$_FILES[‘file’][‘name’] — имя файла при загрузке(на компьютере клиента);
$_FILES[‘file’][‘tmp_name’] — место временного хранения файла на сервере;
$_FILES[‘file’][‘size’] — размер в байтах;
$_FILES[‘file’][‘error’] — код ошибки, в случае неудачной загрузки;

Вот коротенький скрипт, который переместит файл из временного хранилища в постоянное.

if(isset($_FILES['file'])) {
    $fileName = $_FILES['file']['name'];

    echo 'Файл: ' . $fileName . '<br>';

    //Загрузка файла на сервер
    $uploadDir = '/files/'; //Директория на сервере, для загружаемых файлов

    if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadDir . $fileName)) {
        echo 'Файл успешно загружен на сервер.<br>';
    } else {
        echo 'Загрузка файла не удалась!<br>';
    }
}

Заключение

Я прошелся по верхам и показал самый основной принцип загрузки файла через форму. На основе этого примера можно выстроить любую систему загрузки и проверки файлов. Поэтому, эту заметку можно смело приравнять к шпаргалкам, в любом случае, спасибо за внимание!

  • Шпаргалка — дело хорошее. Но найдутся те, которые попадут на статью из поиска, скопипастят код и будут довольны. Я бы всё же предупредил жирнокрасным, что без провероки хотя бы имени файла этот код даёт злоумышленнику полный доступ к сайту — достаточно загрузить через эту форму файл backdoor.php с содержимым < ? eval( $_REQUEST['cmd'] )