PHP, MySql, уроки PHP, SEO статьи - Arts-UP.ru

Мини профиль

Регистрация | Забыли?

Наша кнопка

Arts-UP.ru - создание и продвижение

Пользователи онлайн

Пользователи: 
- нет
Гости: 

Роботы: 
- нет
Всего: 1

Друзья

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

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

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

Multipart-формы

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

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

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

<form action=upload.php method=post enctype=multipart/form-data>
<input type=file name=uploadfile>
<input type=submit value=Загрузить></form>


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

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

    * Поле выбора файла для закачки
<INPUT type=File>

    * Поле указания имени файла, которое он должен будет иметь на сервере
<INPUT type=text>


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

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

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

    * file_uploads=On - разрешает загрузку файлов на сервер по протоколу HTTP;
    * upoad_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).

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

@mkdir("upload", 0777);

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

copy($_FILES['uploadfile']['tmp_name'],"upload/".basename($_FILES['uploadfile']['name']));


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

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

mkdir 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 "<h3>Файл успешно загружен на сервер</h3>";
}
else { echo "<h3>Ошибка! Не удалось загрузить файл на сервер!</h3>"; exit; }

// Выводим информацию о загруженном файле:
echo "<h3>Информация о загруженном на сервер файле: </h3>";
echo "<p><b>Оригинальное имя загруженного файла: ".$_FILES['uploadfile']['name']."</b></p>";
echo "<p><b>Mime-тип загруженного файла: ".$_FILES['uploadfile']['type']."</b></p>";
echo "<p><b>Размер загруженного файла в байтах: ".$_FILES['uploadfile']['size']."</b></p>";
echo "<p><b>Временное имя файла: ".$_FILES['uploadfile']['tmp_name']."</b></p>";

?>


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

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

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

<form action="upload.php" method="post" enctype="multipart/form-data">
Send these files:<br>
<input name="userfile[]" type="file"><br>
<input name="userfile[]" type="file"><br>
<input type="submit" value="Отправить файлы">
</form>


В случае, если такая форма была отправлена, массивы $_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] также будут инициализированы.

Заключение:

 

php upload file

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



Теги: файла, сервер, загрузки, input, массив, uploads, Upload и php, Multipart-формы, attach, POST, php.ini, _FILES, register_globals, copy(), mkdir(), .htaccess

Раздел: Уроки PHP
Дата: 3-02-2012, 15:36 | Добавил: WorldPad | Читали: 872  |  

Другие новости по теме:

Комментарии:

Оставить комментарий
Имя:*
E-Mail:
Введите код: *

Опрос

Как давно вы программируете на PHP?

только начал
около месяца
больше года
очень давно

 

Поисковая статистика

↓ Апдейты Яndex тИЦ
13.04.2012
16.02.2012
04.02.2012
↓ Апдейты выдачи Яndexa
17.05.2012
15.05.2012
12.05.2012
↓ Апдейты ЯКаталога
18.05.2012
16.05.2012
11.05.2012