Отдаем файлы эффективно с помощью PHP. Загрузка файлов с помощью PHP Php файлы большие загрузить на сервер
На PHP часто нужна загрузка файлов на сервер...приятно же, если у вашего сайта есть возможность загружать файлы на сайт: картинки или другие текстовые файлы или другие форматы...поговорим в этой статье об этом...
Итак нам нужно научиться загружать файл на сервер с помощью PHP. Для этого нам нужно знать, что такие загрузки происходят с помощью простой multipart-формы , у которой имеется специальное поле для загрузки файла.
В качестве параметра enctype в такой форме нужно указывать значение multipart/form-data. Отправляется методом POST.
Как обрабатывать multipart-формы на PHP
После нажатия кнопки "Загрузать" PHP помещает файл во временную директорию и задает файлу временное имя(оно отличается от загружаемого - ниже будет видно). И сразу же создается 4 переменных глобального массива $_FILES:
- $_FILES["uploadfile"]["name"] - имя файла до его отправки на сервер (то есть оригинальное);
- $_FILES["uploadfile"]["size"] - размер принятого файла в байтах;
- $_FILES["uploadfile"]["type"] - MIME-тип принятого файла (если браузер смог его определить), например: image/gif, image/png, image/jpeg, text/html;
- $_FILES["uploadfile"]["tmp_name"] - содержит имя файла во временном каталоге, например: /tmp/php57Opq2Y;
- $_FILES["uploadfile"]["error"] - Код ошибки, которая может возникнуть при загрузке файла. Ключ ["error"] был добавлен в PHP 4.2.0.
Обратите внимание : после окончания работы скрипта загрузки файла на сервер - временный файл будет удален, поэтому необходимо скопировать этот файл из временной директории в какую-либо папку, например files при помощи функции copy() ; Не нужно применять функцию move(), так как у copy в этот момент есть 2 преимущества: временный файл самостоятельно удалиться, и если временный каталог находится на другом носителе - то выведется ошибка.
Подсказка : процесс должен начинаться по условию нажатия кнопки "Загрузить", то ест к примеру: if($_POST["submit"]){то выполняй действия}
Картинка, которая наглядно покажет 4 созданные переменные глобального массива $_FILES:
Я думаю теперь все у вас прояснилось, что куда попадает и что-где создается...и далее манипулирую этими полями, можем начать работать с этой формочкой на php
Примерно так может выглядеть сам скрипт:
if($_POST["submit"]){
@mkdir("files", 0777); // создаем папку, если ее нет то ошибки не будет, задаем права
/*echo "
";";*/
print_r($_FILES);
echo "
$uploaddir = "files/";
$uploadfile = $uploaddir.basename($_FILES["uploadfile"]["name"]);
If(copy($_FILES["uploadfile"]["tmp_name"], $uploadfile)){
echo "
Файл успешно загружен на сервер
";}else{
echo "
Не удалось загрузить файл на сервер
";exit;
}
//Данные о загруженном файле
echo "
Информация о загруженном на сервер файле:
";echo "
Оригинальное имя загруженного файла: ".$_FILES["uploadfile"]["name"]."
";echo "
Mime-тип загруженного файла: ".$_FILES["uploadfile"]["type"]."
";echo "
Размер загруженного файла в байтах: ".$_FILES["uploadfile"]["size"]."
";echo "
Временное имя файла: ".$_FILES["uploadfile"]["tmp_name"]."
";}
Вот так вот и происходит процесс загрузки файла на сервер средствами 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;
- (так мы назвали поле загрузки файла) - содержит имя файла во временном каталоге, например: /tmp/phpV3b3qY;
- $_FILES["uploadfile"]["error"] - Код ошибки, которая может возникнуть при загрузке файла. Ключ ["error"] был добавлен в PHP 4.2.0. С соответствующими кодами ошибок вы можете ознакомиться
После завершения работы скрипта, временный файл будет удален. Это означает, что мы должны его скопировать в другое место до завершения работы скрипта. То есть алгоритм работы сценария загрузки файла на сервер такой:
Если кнопка "Submit" нажата, то файл уже будет загружен на сервер и его имя будут в переменной $_FILES["uploadfile"]["name"] . В этом случае скрипт должен сразу скопировать файл с именем $_FILES["uploadfile"]["tmp_name"] в какой-нибудь каталог (необходимы права на запись в этот каталог).
Копирование файла производится функцией copy() :
Используйте только функцию копирования copy() , а не перемещения, поскольку:
- Временный файл будет удален автоматически;
- Если временный каталог находится на другом носителе, будет выведено сообщение об ошибке.
Предположим, нам нужно загрузить файл в каталог uploads , который находится в корневом каталоге веб-сервера (в каталоге DocumentRoot ).
// На всякий случай создадим каталог. Если он уже создан,
// сообщение об ошибки мы не увидим, поскольку воспользуемся оператором @:
@mkdir("uploads", 0777);
// Копируем файл из /tmp в uploads
// Имя файла будет таким же, как и до отправки на сервер:
Copy($_FILES["uploadfile"]["tmp_name"],"uploads/".basename($_FILES["uploadfile"]["name"]));
В Linux все намного сложнее - нам нужно учитывать права доступа к каталогу uploads . Скорее всего в таком случае, функция mkdir() не сработает, так как у нас нет прав на запись в каталог DocumentRoot (обычно это /var/www/html или /home/httpd/html). Зарегистрируйтесь в системе как пользователь root , создайте каталог uploads и измените его владельца и права доступа следующим образом:
// Создаем каталог 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
"Файл успешно загружен на сервер
"
;
}
else
{
echo
"Ошибка! Не удалось загрузить файл на сервер!
"
;
exit
;
}
// Выводим информацию о загруженном файле:
echo
"Информация о загруженном на сервер файле:
"
;
echo
"
echo "
Mime-тип загруженного файла: "
.$ _FILES [ "uploadfile" ][ "type" ]. "" ;echo "
Размер загруженного файла в байтах: "
.$ _FILES [ "uploadfile" ][ "size" ]. "" ;echo "
Временное имя файла: "
.$ _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"] будет иметь значение some.html , а переменная $_FILES["userfile"]["name"] - значение file.bin . Аналогично, переменная $_FILES["userfile"]["size"] будет содержать размер файла some.html и так далее.
Переменные $_FILES["userfile"]["name"] , $_FILES["userfile"]["tmp_name"] , $_FILES["userfile"]["size"] и $_FILES["userfile"]["type"] также будут инициализированы.
Заключение:
Как видите, организовать загрузку файлов на сервер не так сложно. Сложнее обеспечить необходимый уровень безопасности, так как загрузка файлов на сервер может использоваться злоумышленниками для атаки на сервер. О том, как обеспечить необходимый уровень безопасности, работая с Uploads , смотрите .
<<< Назад | Содержание | Вперед >>> |
Есть еще вопросы или что-то непонятно - добро пожаловать на наш | |
|
Для того чтобы сделать систему загрузки картинки или любого другого файла на сервер используется HTML-форма и PHP-скрипт обработки данных, отправленных этой формой. Именно таким способом реализованы разнообразные сервисы поддерживающие загрузку файлов на сервер. Реализуется она подобно обычной форме отправки данных на сервер .
HTML форма отправки файла
Самая простая форма загрузки файла:
В результате получим форму, содержащую поле для выбора файла и кнопку, отправляющую данные формы на сервер:
Параметр entype получает в этой форме значение multipart/form-data, что определяет, что в данной форме будет выполнена отправка бинарных данных, т.е. файла. Если это значение не указать, то по умолчанию форма будет выполняться как отправка текстовой информации.
Параметр MAX_FILE_SIZE , указанный в форме определяет максимальный размер файла, заданный в байтах. По умолчанию, этот размер определяется настройками сервера.
Для указания загружаемого файла тег должен содержать тип "file", а так же для дальнейшей работы PHP-скрипта следует указать значение "name".
Отправка данных формы выполняется тегом с типом "submit". Он отображается обычной кнопкой.
PHP код сохранения файла
Задача этого обработчика, получив данные формы, проверить ее на возможные ошибки, переместить полученный сервером временный файл в нужное место с заданным именем. Здесь же могут выполнять еще различные необходимые операции – запись информации в БД, создание уменьшенных копий изображений, сохранение изображений с добавлением авторских прав и многое другое.
В принимающем коде, данные о файле содержатся суперглобальном массиве $_FILES. Соответственно, просмотреть сведения об отправленном из формы файле, можно в $_FILES["my_file"]. Такой массив содержит следующую информацию:
После получения этой информации на сервере, файл должен быть скопирован в постоянную директорию, т.к. временный файл по завершении скрипта автоматически будет удален.
Копирование выполняется функцией copy() , параметрами которой служит имя исходного файла (для этого случая имя временного файла - $_FILES["my_file"]["tmp_name"]) и имя конечного файла.
В итоге должен получиться следующий код:
// указание директории и имени нового файла на сервере
$new_file = "/upload_files/"
.$_FILES["uploadfile"
]["name"
];
// копирование файла
if
(copy($_FILES["uploadfile"
]["tmp_name"
], $new_file)) {
echo
"Файл загружен на сервер"
;
} else
{
echo
"Ошибка при загрузке файла"
;
?>
Копирование файла, должно выполняться в существующую папку на сервере с имеющимися правами на создание в ней файлов.
В этом примере имя файла указывается тем же, как и у исходного загружаемого файла. В реале же очень часто имя задается в соответствии с собственными требованиями, чаще всего используя дату и время загрузки, что обеспечивает уникальность названия файла. Это позволяет свести хранение и обработку файлов к какому-либо единому стандарту. Здесь, конечно, появляются некоторые дополнительные задачи по хранению исходного названия в БД, если это нужно или определение расширения загружаемого файла . Но в таком случае будет меньше проблем с кодировкой названия фала, а так же цифровое название фала можно использовать для удобного формирования поддиректорий для хранения загружаемых фалов.
Функция copy() возвращает значение true, если копирование выполнено успешно и False при возникновении ошибки в процессе копирования.
При удачном завершении копирования, с загруженным на сервер файлом можно выполнять любые необходимые действия.
Последнее обновление: 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 , проходим по все файлам и сохраняем их в каталог веб-сайта.
Практически в каждом проекте разработчик сталкивается с необходимостью загрузки файлов на сервер. Фотографии, картинки, документы, архивы и многое другое может быть загружено на сервер посредством web-интерфейса (через браузер).
Http://localhost/index.php?name=myname&page=10
определяет запрос GET к странице index.php. При этом скрипту передаются параметры "name" и "page" со значениями "myname" и "10" соответственно. Как видите, запрос состоит из пар "имя=значение", объединённых через "&". Запрос отделяется от адреса страницы знаком вопроса "?".
Но GET не подходит для передачи больших данных. Для этого существует метод POST. Этот метод передаёт данные скрыто от пользователя, а адрес страницы остаётся неизменным. Теоретически, метод POST позволяет передавать огромные блоки данных, но большинство провайдеров устанавливают жесткое ограничение в 5-10 мегабайт.
Для реализации загрузки файла необходимо снабдить пользователя соответствующей формой. Для загрузки файлов предназначен тег input типа file.
Пользователь выбирает нужный файл, нажимает кнопку "Отправить!", после чего браузер передаёт указанный файл на сервер. По окончании загрузки файла запускается receiver.php, и ему автоматически становятся доступны все переданные в форме данные.
Список загруженных файлов хранится в глобальном массиве $_FILES. Это ассоциативный массив, где каждый элемент содержит описание одного из файлов. Рассмотрим на примере:
3145728) { $filesize = ($filesize != 0)? sprintf("(%.2f Мб)" , $filesize / 1024): ""; die("Ошибка: Размер прикреплённого файла ". $filesize." больше допустимого (3 Мб)."); } else { $filename = $_FILES["file"]["name"]; $filepath = $_FILES["file"]["tmp_name"]; $filetype = $_FILES["file"]["type"]; if($this->filetype == null || $this->filetype == "") $this->filetype = "unknown/unknown"; } } } echo "Успешно загружен файл: " . $filename; ?>
Все загруженные файлы сохраняются сервером во временном каталоге и автоматически удаляются после завершения скрипта. Если вам необходимо сохранить файл на сервере - его надо переместить в один из каталогов сайта. Для этого служит специальная функция move_uploaded_file() . Обчно она используется в паре с функцией is_uploaded_file() , которая позволяет определить, был ли файл загружен через форму. Например:
Информация о каждом загруженном файле представляется в скрипте как элемены массива $_FILES. Имя элемента определяется атрибутом name тега формы. В нашем случае атрибут name равен "ufile", значит данные об этом файле будут храниться в элементе $_FILES["ufile"].
Каждый элемент $_FILES так же является массивом, содержащим пять элементов с фиксированными именами:
Размер загружаемых файлов может значительно меняться от провайдера к провайдеру. Некоторые администраторы вообще запрещают загрузку файлов. В этом случае файл всё равно может загрузиться, сервер его удалит, а скрипту сообщит, что файл был, но уже удалён.