PHP Скрипт загрузки файлов


Все для создания своего сайта

В прошлый раз мы рассмотрели вариант формы для загрузки файла. Сегодня подробно разберем скрипт-обработчик загрузки файла на языке php.

Код файла обработчика следующий:

Скрипт загрузки файлов на сервер php

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

В начале присваиваем переменной $_POST[‘action’] значение $action , затем проверяем содержит ли $action значение send. Если равенство $action==”send” верно, значит данные пришли именно из нашей формы и запускаем работу скрипта.

Далее, проверяем наличие файла в глобальном массиве $_FILES , проверяем существование файла при помощи функции empty()

if(empty($_FILES[‘myfile’][‘name’])),

если глобальная переменная $_FILES пустая, прекращаем работу скрипта и выводим ошибку («Вы не выбрали файл для загрузки»).

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

Проверяем размер загружаемого файла. Это очень просто — все прописано в любом файле в самом массиве $_FILES[`myfile`][`size`]; Допустимый размер вы задаете сами в переменной $filSIZE=10000; Напишите любое число которое вам нужно. Если с объемом файла все в порядке и он не превышает вами заданный размер, можно приступать к загрузке файла на ваш сервер.

Тут есть один нюанс: название файла можно менять или переименовать его по своим правилам.

Названия многих файлов могут совпадать и содержать одни и те же имена. Например, 1.jpg, file.jpg, default.png и так далее. Вариантов масса и если имена совпадут, своего нужного файла вы не найдете. Поэтому будем переименовывать файлы по своему алгоритму.

Как создать уникальное имя для своего файла?

Об этом написана целая тема и прочитать можно здесь. А пока идем дальше. Копируем временный файл $_FILES[‘myfile’][‘tmp_name’] в ту директорию или папку, где будут храниться все файлы, которые вы будете загружать к себе на сервер.

В нашем случае мы пропишем название директории в переменной $dir.
Все, скопировали файл в нужную директорию, теперь запишем все данные в базу данных.

Чтобы можно было быстро найти наш файл по его id из базы данных. А в папке их может быть сколько угодно. Хоть тысяча, хоть десять миллионов. Все зависит от сервера на котором установлена форма для загрузки файла.

Загрузка файлов с помощью PHP на сервер

Что может быть общего у фотографий, находящихся в онлайн-фотоальбоме, прикреплённых к электронному письму или у файлов, представленных в онлайн-приложении для пакетной обработки? Всех их необходимо загрузить на сервер через интернет из веб-браузера. Действительно, загрузка файлов является важной особенностью многих сайтов и веб-приложений, которые мы используем ежедневно. Из этой статьи вы узнаете, как добавить к себе на сайт поддержку загрузки файлов используя для этого PHP.

Требования перед загрузкой файлов

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

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

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

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

Сначала мы удостоверяемся, что PHP загрузка файла на сервер прошла без ошибок. Затем определяем безопасное имя файла, как я только что описал выше, а затем перемещаем файл в его конечный каталог с помощью move_uploaded_file() . И наконец делаем вызов chmod() , чтобы убедиться, что в новом файле установлены необходимые права доступа.

Вопросы безопасности

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

Илон Маск рекомендует:  Глава 6 создание и сохранение программ

Один из них заключается в том, чтобы проверить тип загружаемого файла, каким он должен быть. Опираться на значение $_FILES[«myFile»][«type»] или на расширение имени файла не является безопасным, поскольку оба могут легко подделываться. Скорее, используйте функцию exif_imagetype() , чтобы проверить содержимое файла и определить, действительно ли это GIF, JPEG или один из нескольких других поддерживаемых форматов изображений. Если exif_imagetype() недоступен (функция требует, чтобы расширение Exif было включено), вы можете использовать getimagesize() . Массив, возвращаемый ей, будет содержать тип изображения, если он распознан.

Для файлов без изображения вы можете использовать exec() для вызова утилиты файлов unix. он определяет тип файла, ища известные двоичные подписи в ожидаемых местах.

Еще один шаг, который вы можете предпринять, — наложить жесткие ограничения на общий размер запроса 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), которая ограничивает количество загрузок файлов. Эти три директивы помогают защитить ваш сайт от атак, которые пытаются нарушить его доступность, вызывая интенсивный сетевой трафик или загрузку системы.

Третий шаг, который вы можете предпринять для минимизации риска, — это сканирование загруженных файлов с помощью антивирусного сканера. Это жизненно важно для защиты от распространённых вирусов и вредоносных программ, особенно если ваш сайт осуществляет файлообмен между разными людьми, как пример — вложения в веб-почтовый клиент или (юридический) сайт для обмена файлами. Существует расширение PHP, которое обеспечивает доступ к ClamAV , но, конечно, вы можете вызвать утилиту командной строки ClamAV так же, как я продемонстрировал для файла.

Подводим итоги и делаем выводы

Сегодня вы узнали, как происходит настройка и осуществляется процесс PHP загрузки файлов на сервер с вашего сайта или веб-приложения. Чтобы загрузка была успешной, форма HTML должна быть отправлена через запрос POST с множественным форматированием данных, а PHP должен разрешать передачу, как указано, с помощью директивы file_uploads . После переноса файла, сценарий, ответственный за обработку загрузки, использует информацию, найденную в массиве $_FILES , чтобы переместить файл из временного каталога в нужное место. Я также поделился некоторыми дополнительными мерами предосторожности, которые вы можете предпринять, чтобы защитить себя и своих пользователей от некоторых рисков, связанных с возможностью загрузки файлов. Чтобы гарантировать свою безопасность — проверяйте тип файла, наложите жесткие ограничения на загрузку трафика и применяйте сканирование на наличие вирусов.

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

PHP Скрипт загрузки файлов

Multipart-формы

Загрузка фаилов на сервер осуществляется пользователями сети интернет довольно часто, а именно:

  • Веб-итерфейсы почтовых сервисов, которые позволяют добавалять к письму приложение (attach), а для этого нужно сначала загрузить файл на сервер, и только после этого его можно добавлять к письму;
  • Интерактивные фотогалереи и фотоальбомы, которые не могут существовать без механизма загрузки файлов на сервер;
  • Порталы бесплатного програмного обеспечения, которые используют для обмена файлами различных программ, и.т.д.

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

Вот так примерно будет выглядеть приведенная multipart-форма (вы можете попробовать с ее помощью посмотреть результат работы multipart-форм, загрузив какой-нибудь файл небольшого размера на сервер):

Multipart-формы обычно используют метод передачи POST. Как видно из предыдущего примера, данная форма имеет два поля:

  • Поле выбора файла для закачки ;
  • Поле указания имени файла, которое он должен будет иметь на сервере .

Обработка multipart-форм

Прежде, чем приступить к написанию скрипта обработки multipart-формы, нужно отредактировать файл конфигурации php.ini, чтобы разрешить загрузку файлов на сервер.

Конфигурационный файл PHP php.ini имеет три параметра, связанные с загрузкой файлов на сервер:

  • file_uploads=On — разрешает загрузку файлов на сервер по протоколу HTTP;
  • upload_tmp_dir=/tmp — устанавливает каталог для временного хранения загруженных файлов;
  • upload_max_filesize=2M — устанавливает максимальный объем загружаемых файлов.

Если ваш веб-сервер работает под управлением операционной системы Linux, то нужно перезапустить сервис:

service httpd restart

Как же PHP обрабатывает multipart-формы? Получив файл, он сохраняет его во временном каталоге upload_tmp_dir , имя файла выбирается случайным образом. Затем он создает четыре переменных суперглобального массива $_FILES . Этот массив содержит информацию о загруженном файле.

Переменные, определенные для загруженных файлов, зависят от версии PHP и текущей конфигурации. Суперглобальный массив $_FILES доступен начиная с PHP 4.1.0. В случае, если конфигурационная директива register_globals установлена значением on , дополнительно будут объявлены переменные с соответствующими именами. Начиная с версии 4.2.0 значением по умолчанию для опции register_globals является off .

Содержимое массива $_FILES для нашего примера приведено ниже. Обратите внимание, что здесь предполагается использование имени uploadfile для поля выбора файла, в соответствии с приведенной выше multipart-форме. Разумеется, имя поля может быть любым.

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

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

Если кнопка «Submit» нажата, то файл уже будет загружен на сервер и его имя будут в переменной $_FILES[‘uploadfile’][‘name’] . В этом случае скрипт должен сразу скопировать файл с именем $_FILES[‘uploadfile’][‘tmp_name’] в какой-нибудь каталог (необходимы права на запись в этот каталог).

Копирование файла производится функцией copy():

Используйте только функцию копирования copy() , а не перемещения, поскольку:

  • Временный файл будет удален автоматически;
  • Если временный каталог находится на другом носителе, будет выведено сообщение об ошибке.

Предположим, нам нужно загрузить файл в каталог uploads , который находится в корневом каталоге веб-сервера (в каталоге DocumentRoot ).

// На всякий случай создадим каталог. Если он уже создан,
// сообщение об ошибки мы не увидим, поскольку воспользуемся оператором @:

// Копируем файл из /tmp в uploads
// Имя файла будет таким же, как и до отправки на сервер:

В Linux все намного сложнее — нам нужно учитывать права доступа к каталогу uploads . Скорее всего в таком случае, функция mkdir() не сработает, так как у нас нет прав на запись в каталог DocumentRoot (обычно это /var/www/html или /home/httpd/html). Зарегистрируйтесь в системе как пользователь root , создайте каталог uploads и измените его владельца и права доступа следующим образом:

Илон Маск рекомендует:  Что такое код getnextwindow

// Создаем каталог uploads

// Устанавливаем имя владельца apache и его группу — тоже apache:

chown apache:apache uploads

// Разрешение записи всем (777) + установка закрепляющего бита (1):

chmod 1777 uploads

Размер файла можно ограничить, при желании можно отредактировать файл .htaccess и ограничить доступ к каталогу uploads — указать или конкретных пользователей, которым можно обращаться к каталогу, или IP-адреса.

Вот теперь можно загружать файлы на сервер.

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

php

// Каталог, в который мы будем принимать файл:
$ uploaddir = ‘./files/’ ;
$ uploadfile = $ uploaddir . basename ($ _FILES [ ‘uploadfile’ ][ ‘name’ ]);

// Копируем файл из каталога для временного хранения файлов:
if ( copy ($ _FILES [ ‘uploadfile’ ][ ‘tmp_name’ ], $ uploadfile ))
<
echo «

Файл успешно загружен на сервер

Ошибка! Не удалось загрузить файл на сервер!

Информация о загруженном на сервер файле:

Оригинальное имя загруженного файла: » .$ _FILES [ ‘uploadfile’ ][ ‘name’ ]. «

Mime-тип загруженного файла: » .$ _FILES [ ‘uploadfile’ ][ ‘type’ ]. «

Размер загруженного файла в байтах: » .$ _FILES [ ‘uploadfile’ ][ ‘size’ ]. «

Временное имя файла: » .$ _FILES [ ‘uploadfile’ ][ ‘tmp_name’ ]. «

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

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


Также предусмотрена возможность автоматического получения организованной в массив информации о нескольких одновременно загружаемых файлах. Для реализации такой возможности используйте тот же синтаксис отправки массива из HTML-формы, что и для множественных полей select и checkbox :

В случае, если такая форма была отправлена, массивы $_FILES[‘userfile’] , $_FILES[‘userfile’][‘name’] , и $_FILES[‘userfile’][‘size’] будут инициализированы (точно так же, как и $HTTP_POST_FILES для PHP 4.1.0 и более ранних версий). Если конфигурационная директива register_globals установлена значением on , также будут инициализированы сопутствующие глобальные переменные. Каждая из таких переменных будет представлять собой численно индексированный массив соответствующих значений для принятых файлов.

Предположим, что были загружены файлы /home/test/some.html и /home/test/file.bin . В таком случае переменная $_FILES[‘userfile’][‘name’][0] будет иметь значение some.html , а переменная $_FILES[‘userfile’][‘name’][1] — значение file.bin . Аналогично, переменная $_FILES[‘userfile’][‘size’][0] будет содержать размер файла some.html и так далее.

Переменные $_FILES[‘userfile’][‘name’][0] , $_FILES[‘userfile’][‘tmp_name’][0] , $_FILES[‘userfile’][‘size’][0] и $_FILES[‘userfile’][‘type’][0] также будут инициализированы.

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

Загрузка файлов на сайт: PHP, AJAX, HTML5 и Drag’n’Drop

Скучные формы загрузки — прошлый век. HTML5 дает возможности, чтобы добавить Drag’n’Drop, а AJAX позволяет загружать файлы без обновления страницы.

В основном пользователи смотрят или скачивают информацию с сайтов, но иногда им может быть нужно что-нибудь загрузить самим. Это может быть аватарка, архив с документами, песня, видео со свадьбы или статья в формате .docx.

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

Загрузка файла на сервер в PHP

Я в PHP не особо силен, но пролистав несколько страниц гугла я понял что моя ситуация не типичная.

Мне нужно с помощью скрипта загрузить файл на сервер. Для этого я нашел в интернете очень простой html-файл:

и такой же простой скрипт:

Как и следовало ожидать — файл не загружается. Вся проблема в том, что в $_FILES[«file»][«error»] ничего не содержится. После «загрузки» массив $_FILES имеет следующий вид:

post_max_size = 8M
file_uploads = On
upload_max_filesize = 2M

и т.д., все в общем учтено и все выставлено как нужно.

Картинку я загружаю именно нормальную JPEG, с расширением jpg. Впрочем, даже когда я вообще убираю все эти проверки на тип файла — все равно все то же самое происходит. Пробовал на разных браузерах. Скрипт крутится на моем instance на amazon aws ec2 под управлением SuSE Linux, Apache2.

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

Как загрузить файл на сервер используя PHP? В этой статье мы подробно рассмотрим этот вопрос с примерами.

HTML-форма для отправки файла

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

Вот пример HTML-кода такой формы:

Что уникального в этой форме:

  1. Тег form должен обязательно содержать атрибут enctype=»multipart/form-data . Именноо этот атрибут указывает на то, что форма будет передавать файл. По умолчанию атрибут enctype имеет значение application/x-www-form-urlencoded .
  2. Форма должна содержать скрытый атрибут ( type=»hidden» ) с именем MAX_FILE_SIZE в значении которого ( value ) указывается размер файла. Теоретически, браузеры должны сообщать о том, что файл превышает допустимые размеры, но на практике браузеры не поддерживают это. Я думаю, что этот атрибут можно не указывать.
  3. Для выбора передаваемого файла служит тег input , у которого атрибут type=»file» .

После того, как сервер получил HTTP-запрос от такой формы, он записывает файл во временную папку на сервере.

Если хотите чтобы файл на этом этапе сохранялся в другой каталог, укажите его в директиве upload_tmp_dir файла php.ini.

Для перемещения загруженного файла в новое место используется функция move_uploaded_file .

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

Массив $_FILES

Итак, после того, как скрипт получил данные формы с переданным файлом, файл он записал в специальную папку, а данные о файле записал в двумерный массив $_FILES .

Давайте рассмотрим пример, который выводит содержимое массива $_FILES на экран.

Скачивание файлов php

Ниже в этой статье вы можете увидеть универсальный скрипт для скачивание файлов на php, но давайте рассмотрим одну проблему и как скрипт её устраняет.

Если этот скрипт покажется вам сложным, советую посмотреть, как на простом примере реализуется скрипт cкачивания изображений и текстовых файлов на php.

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

После проверки выясняется, что файлы без проблем скачиваются. Однако вскоре возникает одна проблема: Internet Explorer не спрашивает, скачать файл или просто открыть, а запускает медиа-плеер.

Та же проблема встречается с файлами и других форматов. Пользователям не всегда нужно, чтобы файлы pdf, doc или gif способствовали открытию соответствующих программ. Для решения этой проблемы существует PHP-скрипт, предназначенный для скачивания файлов.

PHP скрипт для скачивания файлов:

Этот скрипт будет делать пользователям запрос, которые смогут выбрать, сохранить тот или иной файл или открыть его. Вам необходимо создать файл dl_save.php, а затем скопировать в него нужный код. Ссылка, которая ведет на скачивание файла, выглядит примерно следующим образом:

Ссылку на скачивания файла оформлять нужно (примерно) так:

PHP — загрузка файла

Дата публикации: 2020-10-18

От автора: сегодня мы поговорим о том, как происходит в PHP загрузка файла. Скрипт PHP можно использовать с формой HTML, чтобы пользователи могли загружать файлы на сервер. Первоначально файлы загружаются во временный каталог, а затем перемещаются в место назначения с помощью скрипта PHP.

Информацияна странице phpinfo.php описывает временный каталог, который используется для загрузки файлов, например upload_tmp_dir, а максимальный размер файлов, которые могут быть загружены, указывается как upload_max_filesize. Эти параметры задаются в файле конфигурации PHP php.ini. Процесс загрузки файла выполняется следующим образом:

Илон Маск рекомендует:  Проверка информации введенной в форму

Пользователь открывает страницу, содержащую HTML-форму с текстовыми файлами, кнопкой Обзор и кнопкой Отправить.

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

Полный путь к выбранному файлу отображается в текстовом файле, затем пользователь нажимает кнопку Отправить.

Как создать сайт самому?

Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!

Выбранный файл отправляется во временный каталог на сервере.

PHP-скрипт, который был указан в качестве обработчика формы в атрибуте формы action, проверяет, доставлен ли файл, а затем копирует этот файл в целевую директорию.

Скрипт PHP подтверждает успешное завершение действия.

Как обычно, для временного и целевого каталога должны быть указаны права доступа на запись файлов. Если установлены права «только для чтения», процесс завершится неудачно. Загруженным файлом может быть текстовый файл или файл изображения, или любой документ.

Создание формы загрузки

Приведенный ниже HTML-код создает форму для загрузки. В этой форме для атрибута method задано значение post, а для атрибута enctype — multipart / form-data.

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

Как загрузить файл на сервер используя PHP? В этой статье мы подробно рассмотрим этот вопрос с примерами.

HTML-форма для отправки файла

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

Вот пример HTML-кода такой формы:

Что уникального в этой форме:

  1. Тег form должен обязательно содержать атрибут enctype=»multipart/form-data . Именноо этот атрибут указывает на то, что форма будет передавать файл. По умолчанию атрибут enctype имеет значение application/x-www-form-urlencoded .
  2. Форма должна содержать скрытый атрибут ( type=»hidden» ) с именем MAX_FILE_SIZE в значении которого ( value ) указывается размер файла. Теоретически, браузеры должны сообщать о том, что файл превышает допустимые размеры, но на практике браузеры не поддерживают это. Я думаю, что этот атрибут можно не указывать.
  3. Для выбора передаваемого файла служит тег input , у которого атрибут type=»file» .

После того, как сервер получил HTTP-запрос от такой формы, он записывает файл во временную папку на сервере.

Если хотите чтобы файл на этом этапе сохранялся в другой каталог, укажите его в директиве upload_tmp_dir файла php.ini.

Для перемещения загруженного файла в новое место используется функция move_uploaded_file .

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

Массив $_FILES

Итак, после того, как скрипт получил данные формы с переданным файлом, файл он записал в специальную папку, а данные о файле записал в двумерный массив $_FILES .

Давайте рассмотрим пример, который выводит содержимое массива $_FILES на экран.

Скачиваем файлы с помощью PHP и возможностью докачки

Давайте соберем воедино всю информацию, которую мы знаем о том, как отдавать файлы средствами PHP. Вообще, файлы можно отдавать напрямую средствами NGINX или Apache, но иногда требуется, чтобы мы могли учитывать количество скачиваний определенного файла или могли разрешать каким-то пользователям скачивать файл, а каким-то пользователям запрещать. Сделать это можно только в том случае, если за отдачу файла пользователю будет отвечать какой-то скрипт. В нашем случае, скрипт будет написан на языке PHP.

Давайте перейдем сразу к делу и напишем PHP код, который будет отдавать какую-то картинку с нашего сервера:

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

Проверить, включена ли буферизация вывода можно с помощью функции ob_get_level(). Подробнее об этой функции есть в официальной документации PHP. Если говорить коротко, то эта функция возвращает уровень вложенности буферизации. Если буферизация отключена, то функция вернет 0.

Собственно, перед выводом файла нам нужно проверить буферизацию, а если она включена, то отключить.

Функция ob_end_clean() очищает буфер вывода и отключает его, если он был включен. Если буфер был включен с помощью ob_start() и был какой-то вывод до вызова этой функции, то он будет удален.

Но вернемся к нашему коду. Допишем код скачивания, но теперь сделаем проверку на буферизацию и отключим ее, если она была включена:

Давайте теперь разберемся, что означают эти заголовки?

В этом заголовке мы даем понять браузеру, что будет скачана картинка в формате JPEG. Есть множество MIME типов и желательно, чтобы при отдаче файла вы указывали реальный MIME тип файла. В зависимости от этого типа файла, браузер у пользователя может показывать правильное окно для сохранения файла или сразу показывать файл в браузере. Список MIME типов можно посмотреть на странице в Википедии:

Прочитать правильный MIME тип файла перед его отправкой пользователю можно с помощью функции mime_content_type($filePath)

Если вы не хотите узнавать точный MIME тип файла, то можно воспользоваться универсальным MIME типом, который подходит для всех файлов — application/octet-stream:

Мы говорим браузеру: браузер, мы передали вам двоичный файл без указания точного формата файла. Делай с ним что хочешь. При этом не важно, какое будет расширение у файла. Это может быть картинка с расширением .jpg или .php

В этой строчке содержится описание того, что мы будем делать. Собственно на этом функционал этого header’a заканчивается. К сожалению, я не нашел точную информацию относительно строки File Transfer. Мне кажется, браузеры ее игнорируют.

Это очень важный header. При использовании этого header’a мы даем браузеру понять, что нужно скачать файл. Браузер при этом сам решает, скачивать файл автоматически или показать его в браузере. Все зависит от настроек браузера и от переданного MIME типа. Если мы передаем filename, то в браузер будет возвращен файл с этим именем. Очень полезно, когда скачивая картинку, у вас она скачивается с расширением .html или .php.

Остальные параметры не столь важны, за исключением Content-Length. С помощью параметра Content-Length мы передаем точный размер скачиваемого файла в байтах. В этом случае, в браузере будет реализован механизм просмотра оставшегося времени скачивания файла и сколько мегабайт уже скачалось.

Собственно, код скачивания файла готов, но у этого кода есть один очень серьезный недостаток. Код, который мы написали выше не поддерживает докачку файла. Если пользователи скачивают небольшие файлы, например картинки, то это не проблема. Но что делать, если размер файла больше гигабайта? Правильно! Организовывать докачку файла. Сделать докачку файла на PHP очень просто. Сначала я покажу готовый код:

Код очень простой, а благодаря комментариям, я думаю вы в нем разберетесь. Что мы делаем в коде выше? Да собственно ничего серьезного, проверяем существование файла, открываем файл на чтение, смотрим был ли передан range, чтобы пропустить то количество байт, которые пользователь скачал и в конце начинаем отдавать пользователю файл по 8192 килобайт. Это стандартный размер буфера функции readfile.

Код, представленный выше дает возможность скачивания файлов с помощью PHP. Вам остается лишь добавить по желанию запись в базу данных о скачиваемом файле или выполнить еще какие-то действия.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL