• Загрузка файлов с помощью PHP. Пример загрузки файлов на сервер (upload) на языке php Php загрузка файлов на сервер и сессии

    06.03.2023
    27.12.16 19K

    Сегодня я хочу рассказать вам о разнообразных ситуациях, связанных с загрузкой файлов на сервер с помощью PHP-скриптов . Постараюсь привести примеры, как самой простой загрузки файла, так и мультизагрузки с применением move uploaded file PHP .

    Для загрузки файлов на сервер. Прежде всего, нужно создать HTML-форму с полем file input . Затем привязать к ней PHP-скрипт , который переместит файл в указанную директорию. Чтобы закачать файл на сервер с помощью PHP-скрипта , выполните следующие действия:

    1. Создайте простую HTML-форму : потребуется простая форма с возможностью указания файла. Она размещается в файле basic.php :

    Basic File Upload

    Basic File Upload


    Приведенный выше код необходим для создания формы. Как только пользователь выбирает файл и нажимает кнопку Upload , форма передаст данные с помощью метода POST на этой же странице, так как в качестве обработчика указан файл basic.php :

    Важно: не забудьте добавить enctype=”multipart/form-data” в тег

    .

    1. Создаем PHP-скрипт для обработки формы загрузки. В PHP вся информация о загруженных файлах содержится в глобальной переменной $_FILES . То есть, используя $_FILES , можно проверить, был ли загружен файл. Если файл был загружен, то можно переместить его в нужную директорию при помощи функции move_uploaded_file PHP :

    Приведенный выше код проверяет, загрузил ли пользователь файл. Если файл загружен, то мы перемещаем файл в указанную директорию. В приведенном выше скрипте мы перемещаем файл в ту же папку, где находится файл basic.php .

    Ниже приведена полная версия PHP move uploaded file примера :

    Basic File Upload

    Basic File Upload


    Пожалуйста, не тестируйте этот PHP move uploaded file пример на сервере. Он не отвечает требованиям безопасности, и был создан специально для того, чтобы наглядно показать, как загружать файлы с помощью PHP .

    Вопрос: Почему приведенный выше скрипт небезопасен?
    Ответ: С помощью скрипта, приведенного выше, можно загрузить файл любого типа на сервер. То есть, если вы используете скрипт в таком виде на “живом ” сервере, то любой хакер сможет загрузить собственные PHP-скрипты , и взломать ваш сайт и сервер.

    Чуть позже мы подробнее поговорим о защите скрипта для загрузки файлов на сервер.

    Что такое $_FILES?

    $_FILES – это глобальная переменная в PHP наподобие $_POST или $_GET . Она представляет собой ассоциативный массив, в котором находится информация о загруженном файле с помощью метода HTTP POST .

    То есть, если выполнить print_r($_FILES) для приведенного выше скрипта, то мы получим следующую информацию:

    Array ( => Array ( => upload-file-php.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpcQiYhh => 0 => 6887))

    То есть, для каждого поля в массиве создается элемент. Если вы создадите , то название элемента также будет изменено на test . Например:

    Array ( => Array ( => upload-file-php.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpcQiYhh => 0 => 6887))

    Теперь для каждого input file , перемещаемого с помощью move uploaded file PHP , создается пять элементов (name , type , tmp_name , error , size ). Давайте познакомимся с этими элементами поближе:

    1. name: содержит название загруженного пользователем файла. Если вы загрузите файл abc.txt в браузер, то элемент name получит название abc.txt ;
    2. type: тип загруженного файла или mime-type , если точнее. Для файла JPG этот элемент будет иметь значение image/jpeg . Если загрузить текст, то элемент получит значение text/plain . Для разных типов файлов разным будет и mime-type . Ниже приведены самые распространенные mime-типы :
    • JPEG: image/jpeg ;
    • PNG: image/png ;
    • Текст: text/plain ;
    • Word: application/msword .
    1. tmp_name: временное расположение для загруженного файла. Этот путь можно изменить в переменной upload_tmp_dir , указанной в файле php.ini .
    1. 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) . Невозможно записать файл на диск.
    1. size: размер загруженного файла в байтах.

    Что такое move_uploaded_file?

    move_uploaded_file представляет собой функцию, которая перемещает загруженный файл из временной директории в папку назначения. Перед перемещением move_uploaded_file PHP проверяет, был ли загружен файл, указанный в HTTP-методе post .

    Если файл был успешно перемещен, то вы получите ответ true или false . В первом примере мы использовали следующую строку кода:

    move_uploaded_file($_FILES["inputfile"]["tmp_name"], $destiation_dir)

    А теперь давайте сделаем красиво, и выведем информацию:

    if(move_uploaded_file($_FILES["inputfile"]["tmp_name"], $destiation_dir)){ echo "File Uploaded" } else{ echo "File Not uploaded" }

    Изменяем лимит размера загружаемого файла

    У каждой формы для загрузки файлов должен быть установлен лимит размера, иначе пользователи станут загружать увесистые файлы. Выставить ограничение на 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 в форму загрузки. Сделать это можно так: .

    Если нужно сильно увеличить filesize , то не забудьте изменить время исполнения php-скриптов .

    Как обезопасить PHP-скрипт загрузки файлов

    Теперь вы умеете ограничивать размер загружаемых файлов и знаете, как определить типы файлов, которые загружают пользователи. Пришло время позаботиться о безопасности нашего PHP move uploaded file примера.

    В качестве примера сделаем так, чтобы пользователи не могли загружать jpeg-файлы размером свыше 1 Мб. Установите соответствующее ограничение в переменной upload_max_filesize файла php.ini . Ниже приведена улучшенная версия скрипта:

    Secure File Upload

    Secure File Upload


    Мультизагрузка файлов при помощи PHP-скрипта

    Можно загружать сразу несколько файлов при помощи $_FILES и move_uploaded_file PHP . Ниже я расскажу вам о двух способах мультизагрузки файлов с помощью PHP-скрипта :

    1. Используя разные имена Input .
    2. Используя одно и то же имя input, но с привлечением массива.

    1. Используя разные имена Input:

    Можно загружать сразу несколько файлов, используя несколько элементов ввода. Как уже говорилось ранее, если мы создаем несколько элементов input, то в $_FILES будет создано несколько основных элементов. Например, для приведенной ниже формы:

    $_FILES представит массив следующего содержания:

    Array ( => Array ( => 20141002_094257.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpoBWrBZ => 0 => 2669096) => Array ( => 20141002_094247.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpjwUmVZ => 0 => 2207657))

    Приведенный ниже PHP move uploaded file пример нужно писать с учетом того, что один элемент предназначен для аватарки (изображение ), а другой – для загрузки резюме (файла в формате .doc ):

    Multiple File Upload

    Multiple File Upload



    2. Используем одно поле input, но с применением массива:

    Как и в случае с другими типами input , для move uploaded file PHP мы можем использовать массив с input type , указанным в php . То есть:

    То есть, для приведенного выше HTML , $_FILES предоставит данные со следующей структурой:

    Array ( => Array ( => Array ( => upload-file-php.jpg => variable-scope-php.jpg => magic-constants.jpg) => Array ( => image/jpeg => image/jpeg => image/jpeg) => Array ( => /Applications/XAMPP/xamppfiles/temp/phpML5kOy => /Applications/XAMPP/xamppfiles/temp/phpNZbuw7 => /Applications/XAMPP/xamppfiles/temp/phpO8VFAk) => Array ( => 0 => 0 => 0) => Array ( => 6887 => 8036 => 9967)))

    Скачать код, использованный в статье

    Данная публикация представляет собой перевод статьи «File Upload With PHP Script » , подготовленной дружной командой проекта

    Хорошо Плохо

    В нашей статье мы рассмотрим пример создания php скрипта загрузки файлов на сервер. Наш простой пример загрузки файлов будет иметь 2 файла: форма (form.html), php скрипт загрузки файлов (uploader.php).

    Теперь разберем все детально. Сначала проанализируем файл формы form.html:


    Как видите это простой html код, ничего сложного здесь нет, единственное, если форма будет загружать файлы на сервер, то должен быть прописан атрибут enctype=" multipart/ form- data" .

    Наша форма будет выглядеть так:

    Пример PHP скрипта загрузки файлов

    Теперь разберемся с php файлом, который будет загружать файлы на сервер. Ниже предоставлен его исходный код:

    // Where the file is going to be placed $target_path = ‘uploaded_files/"; /* Add the original filename to our target path. Result is "uploaded_files/filename.extension" */ $target_path = $target_path . basename($_FILES["file"]["name"]); if(move_uploaded_file($_FILES["file"]["tmp_name"], $target_path)) { echo "The file ". basename($_FILES["file"]["name"]). " has been uploaded"; } else{ echo "There was an error uploading the file, please try again!"; }

    Как работает PHP скрипт загрузки файлов?

    uploader.php это простой php скрипт загрузки файлов на сервер, который будет загружать наши файлы в определенную директорию сайта, которая указывается строкой $target_path = "uploaded_files/";

    Ну и само собой делаем элементарный вывод сообщений с помощью if/else, чтобы понятно было, загружен наш файл или нет.

    Защита от хакерских взломов при загрузке файла

    Мы рассмотрим не только защиту в плане хакерских взломов, но и другие нежелательные проблемы, возникающие при загрузке файлов на сервер.

    PHP оболочка файла

    Это первая проблема, связанная с загрузкой файлов на сервер. Когда загружаемый файл имеет оболочку php, и это не значит, что его расширение будет php. Он может иметь вид image.jpg (.gif, .png…). Но внутри выглядеть подобным образом:

    Некоторые умельцы также могут выполнять команды на сервере с помощью серфинга по url:

    $ curl http://server/uploads/shell.php?command=any_unix_command

    Способ защиты:

    Для защиты, можно реализовать MIME проверку файла. Ниже смотрите пример:

    If($_FILES["file"]["type"] != "image/gif") { echo "Sorry, we only allow uploading GIF images"; exit; }

    Данный кусок php кода проверяет, является ли загружаемый файл GIF файлом. Вставьте этот код перед php скриптом загрузки файлов. Естественно, вы можете поменять проверку на jpg, pngили другие нужные вам файлы.

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

    Ограничение размера загружаемого файла

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

    Можно это сделать с помощью формы, для этого нужно добавить следующую строку в контекст html формы:

    Это скрытое поле ввода ограничит размер загружаемого файла. Или можно сделать проверку размера файла средствами PHP.

    Писать о php скрипте загрузки файлов можно долго, но мы уже разобрали основный принцип загрузки файлов на сервер. Поэтому, если у кого-то есть еще вопросы, задайте их в комментариях.

    Приложение для загрузки файлов на сервер представляет собой HTML-форму (upload.html) и скрипт upload.php для ее обработки.

    Замечание: Вы можете загрузить промышленную версию системы загрузки файлов на сервер из раздела . Система позволит вам не только загрузить файл на сервер, но и изменить его размер, фон и др.

    Код формы (upload.html)

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



    Код скрипта обработки формы (upload.php)

    Результат загрузки файла 1024 * 3 * 1024 ) { echo (); exit; } // Проверяем загружен ли файл if(is_uploaded_file ($_FILES [ "filename" ][ "tmp_name" ])) { // Если файл загружен успешно, перемещаем его // из временной директории в конечную move_uploaded_file ($_FILES [ "filename" ][ "tmp_name" ], "/path/to/file/" . $_FILES [ "filename" ][ "name" ]); } else { echo("Ошибка загрузки файла" ); } ?>

    Атрибут entype формы определяет вид кодировки, которую браузер применяет к параметрам формы. Для того чтобы отправка файлов на сервер действовала, атрибуту entype необходимо присвоить значение multipart/form-data. По умолчанию этот атрибут имеет значение application/x-www-form-urlencoded.

    Элемент ввода этой формы должен иметь тип file.

    После того, как получен HTTP-запрос, содержимое загруженного файла записывается во временный файл, который создается в каталоге сервера, заданном по умолчанию для временных файлов, если другой каталог не задан в файле php.ini (директива upload_tmp_dir).

    Характеристики загруженного файла доступны через двумерный массив $_FILES.

    Cкрипт upload.php загружает файл на сервер и копирует его в каталог /path/to/file/.

    В некоторых случаях требуется ограничить размер файла, который может быть загружен на сервер. К примеру, чтобы разрешить загрузку на сервер только файлов с размером не более 3 Мбайт, в приведенном скрипте содержится код:

    1024 * 3 * 1024 ) { echo("Размер файла превышает три мегабайта" ); exit; } ... ?>

    Максимальный размер загружаемого файла можно также задать при помощи директивы upload_max_filesize, значение которой по умолчанию равно 2 Мбайт:

    upload_max_filesize ) .. ?>

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

    Первым делом, что нужно усвоить - это то, что сама HTML-форма , в которую подставляется файл должна быть не совсем обычной, вот пример HTML-кода такой формы:





    Ключевой момент здесь - это атрибут "enctype " со значением "multipart/form-data ". Без него ничего работать не будет.

    ", в котором мы ещё загружать файл не будем, а пройдёмся немного по различным важным моментам, которые надо обязательно учитывать, иначе может пострадать безопасность:

    print_r($_FILES);
    ?>

    В результате, Вы увидите содержимое глобального двумерного массива $_FILES :

    • name - имя загружаемого файла.
    • type - MIME-type загружаемого файла. Это, пожалуй, самый важный параметр для обеспечения безопасности. И всегда при приёме файлов необходимо проверять MIME-type , иначе проблем не оберётесь. В следующей статье мы поговорим об этом более детально.
    • tmp_name - физический путь к временному файлу. Именно в это место и помещается файл, а уже потом мы его переносим в другое место. Фактически, файл уже загружен, а нам лишь надо его переместить в нужную папку на сервере.
    • error - код ошибки. Если 0 , то ошибок нет.
    • size - размер загружаемого файла. Вот это тоже частоиспользуемая опция, и её также надо проверять, чтобы ограничить размер загружаемых файлов . Безусловно, самим сервером этот размер ограничен, однако, для всяких картинок, этот размер явно завышен (как правило, он 10 МБ ).

    И все эти параметры присутствуют для каждого загружаемого файла (каждые из которых представляют собой массив в двумерном массиве $_FILES ).

    Теперь давайте уже закончим с загрузкой файлов на сервер в PHP , и для этого напишем такой код (""):

    $uploadfile = "images/".$_FILES["somename"]["name"];
    move_uploaded_file($_FILES["somename"]["tmp_name"], $uploadfile);
    ?>

    То есть вначале мы задаём путь к загружаемому файлу на сервере. Здесь мы хотим поместить файл в директорию "images " с тем же именем, что и было раньше у файла. А функцией move_uploaded_file() мы перемещаем файл в выбранную нами директорию из его временного хранилища.

    Однако, обратите внимание, это очень важно! Так использовать код ни в коем случае нельзя, иначе Вашему сайту будет угрожать серьёзная опасность! Фактически, на данный момент может быть загружено абсолютно всё, что угодно: любые исполняемые файлы, скрипты, HTML-страницы и другие весьма опасные вещи. Поэтому обязательно надо проверять загружаемые файлы на сервер очень тщательно. И вот этим мы и займёмся в следующей статье. Поскольку тема очень важная, то я советую Вам подписаться на обновления, чтобы не пропустить эту статью.

    Последнее обновление: 1.11.2015

    Чтобы загрузить файл на сервер, нам надо использовать форму с параметром enctype="multipart/form-data" и массив $_FILES . Итак, создадим файл upload.php со следующим содержимым:

    Загрузка файла

    Выберите файл:

    Здесь определена форм с атрибутом enctype="multipart/form-data" . Форма содержит специальное поле для выбора файла.

    Все загружаемые файлы попадают в ассоциативный массив $_FILES . Чтобы определить, а есть ли вообще загруженные файлы, можно использовать конструкцию if: if ($_FILES)

    Массив $_FILES является двухмерным. Мы можем загрузить набор файлов, и каждый загруженный файл можно получить по ключу, который совпадает со значением атрибута name .

    Так как элемент для загрузки файла на форме имеет name="filename" , то данный файл мы можем получить с помощью выражения $_FILES["filename"] .

    У каждого объекта файла есть свои параметры, которые мы можем получить:

      $_FILES["file"]["name"] : имя файла

      $_FILES["file"]["type"] : тип содержимого файла, например, image/jpeg

      $_FILES["file"]["size"] : размер файла в байтах

      $_FILES["file"]["tmp_name"] : имя временного файла, сохраненного на сервере

      $_FILES["file"]["error"] : код ошибки при загрузке

    Также мы можем проверить наличие ошибок при загрузке. Если у нас нет ошибки, то поле $_FILES["filename"]["error"] содержит значение UPLOAD_ERR_OK .

    При отправке файла на сервер он сначала загружается во временное место, из которого затем с помощью функции move_uploaded_file() он перемещается в каталог сервера.

    Функция move_uploaded_file() принимает два параметра путь к загруженному временному файлу и путь, куда надо поместить загруженный файл.

    Ограничения и настройка загрузки

    По умолчанию размер загружаемых файлов ограничен 2 мб. Однако можно настроить данный показатель в файле конфигурации. Изменим этот показатель, например, до 10 мб. Для этого найдем в файле php.ini следующую строку:

    Upload_max_filesize = 2M

    Изменим ее на

    Upload_max_filesize = 10M

    Также мы можем настроить папку для временных загружаемых файлов. Для этого в файле php.ini найдем следующую строку:

    ;upload_tmp_dir =

    Изменим ее на

    Upload_tmp_dir = "C:/php/upload"

    Также в каталоге php нам надо создать папку upload .

    Мультизагрузка

    Изменим скрипт upload.php так, чтобы он поддерживал множественную загрузку:

    $error) { if ($error == UPLOAD_ERR_OK) { $tmp_name = $_FILES["uploads"]["tmp_name"][$key]; $name = $_FILES["uploads"]["name"][$key]; move_uploaded_file($tmp_name, "$name"); } } } ?>

    Загрузка файла




    Каждое поле выбора файла имеет атрибут name="uploads" , поэтому сервер будет рассматривать набор отправленных файлов как единый массив.

    Затем используя цикл foreach , проходим по все файлам и сохраняем их в каталог веб-сайта.

    Похожие статьи