diff --git a/features/file-upload.xml b/features/file-upload.xml index eef8f67a0..7decf24fb 100644 --- a/features/file-upload.xml +++ b/features/file-upload.xml @@ -1,103 +1,107 @@ + + - - - Загрузка файлов на сервер + + Загрузка файлов на сервер Загрузка файлов методом POST - - PHP способен принимать файл загружаемый при помощи любого - браузера, поддерживающего стандарт RFC-1867 (в том числе - Netscape Navigator 3 и выше, - Microsoft Internet Explorer 3 - с патчем от Microsoft или более поздние версии без патча). - Это дает возможность загружать как текстовые, так и бинарные - файлы. Вместе с PHP-аутентификацией и функциями - для работы с файловой системой вы получаете полный контроль над тем, - кому разрешено загружать файлы, и над тем, что делать с файлом после - его загрузки. + Данная возможность позволяет загружать как текстовые, так и + бинарные файлы. С помощью PHP-функций авторизации и манипуляции + файлайми вы получаете полный контроль над тем, кому разрешено + загружать файлы и что должно быть сделано после их загрузки. + + PHP способен получать загруженные файлы из любого браузера, + совместимого со стандартом RFC-1867. + + Смежные замечания по конфигурации Также ознакомьтесь с описанием директив file_uploads, upload_max_filesize, - upload_tmp_dir, - max_input_time и - post_max_size конфигурационного + upload_tmp_dir, + post_max_size и + max_input_time конфигурационного файла &php.ini; + Также следует заметить, что PHP поддерживает загрузку файлов методом PUT, который используется в клиентах Netscape Composer - и W3C Amaya. Для получения + и W3C Amaya. Для получения более детальной документации обратитесь к разделу поддержка метода PUT - - Страница для загрузки файлов может быть реализована при помощи - специальной формы, которая выглядит примерно так: - + Форма для загрузки файлов + + Страница для загрузки файлов может быть реализована при помощи + специальной формы, которая выглядит примерно так: + - - Отправить этот файл: - + +
+ + + + Отправить этот файл: +
]]>
+ + В приведенном выше примере __URL__ необходимо заменить ссылкой + на PHP-скрипт. + + + Скрытое поле MAX_FILE_SIZE (значение + необходимо указывать в байтах) должно предшествовать полю + для выбора файла, и его значение является максимально + допустимым размером принимаемого файла в PHP. + Рекомендуется всегда использовать эту переменную, так как она + предотвращает тревожное ожидание пользователей при передаче + огромных файлов, только для того, чтобы узнать, что файл + слишком большой и передача фактически не состоялась. + Помните, обойти это ограничение на стороне браузера достаточно + просто, следовательно, вы не должны полагаться на то, что + все файлы большего размера будут блокированы при помощи этой + возможности. Это по большей части удобная возможность для + пользователей клиентской части вашего приложения. + Тем не менее, настройки PHP (на сервере) касательно + максимального размера обойти невозможно. +
+ + + + Также следует убедиться, что в атрибутах формы вы указали + enctype="multipart/form-data", в противном случае + загрузка файлов на сервер выполняться не будет. + + + - В приведенном выше примере "_URL_" необходимо заменить ссылкой - на PHP-скрипт. Скрытое поле MAX_FILE_SIZE(значение необходимо - указывать в байтах) должно предшествовать полю для выбора файла, - и его значение является максимально допустимым размером принимаемого - файла. Также следует убедиться, что в атрибутах формы вы указали - enctype="multipart/form-data", в противном случае - загрузка файлов на сервер выполняться не будет. - - - Опция MAX_FILE_SIZE является рекомендацией браузеру, даже если - бы PHP также проверял это условие. Обойти это ограничение на - стороне браузера достаточно просто, следовательно, вы не должны - полагаться на то, что все файлы большего размера будут блокированы - при помощи этой возможности. Тем не менее, ограничение PHP касательно - максимального размера обойти невозможно. Вы в любом случае должны - добавлять переменную формы MAX_FILE_SIZE, так как она предотвращает - тревожное ожидание пользователей при передаче огромных файлов, только - для того, чтобы узнать, что файл слишком большой и передача фактически - не состоялась. - - + Суперглобальный массив $_FILES доступен + начиная с PHP 4.1.0 (В более ранних версиях используйте вместо + него $HTTP_POST_FILES). + Эти массивы будут содержать всю информацию о загруженных файлах. - Переменные, определенные для загруженных файлов, зависят от - версии PHP и текущей конфигурации. Суперглобальный массив - $_FILES - доступен начиная с PHP 4.1.0. Массив $HTTP_POST_FILES - доступен начиная с PHP 4.0.0. Эти массивы содержат всю информацию - о загруженных файлах. Использование $_FILES - является более предпочтительным. - В случае, если конфигурационная директива register_globals - установлена значением on, дополнительно будут объявлены переменные с соответствующими именами. - Начиная с версии 4.2.0 значением - по умолчанию для опции register_globals - является off. - - - Содержимое массива $_FILES - для нашего примера приведено ниже. Обратите внимание, что здесь предполагается - использование имени userfile для поля выбора файла, как и - в приведенном выше примере. На самом деле имя поля может быть любым. + Содержимое массива $_FILES для нашего примера + приведено ниже. Обратите внимание, что здесь предполагается + использование имени userfile для поля + выбора файла, как и в приведенном выше примере. На самом деле + имя поля может быть любым. $_FILES['userfile']['name'] @@ -112,8 +116,10 @@ Mime-тип файла, в случае, если браузер предоставил такую - информацию. Пример: "image/gif". - + информацию. Пример: "image/gif". Этот + mime-тип не проверяется в PHP, так что не полагайтесь + на его значение без проверки. + @@ -136,46 +142,29 @@ $_FILES['userfile']['error'] - Код ошибки, которая - может возникнуть при загрузке файла. Ключ ['error'] + Код ошибки, + которая может возникнуть при загрузке файла. Этот элемент был добавлен в PHP 4.2.0 - - - В PHP 4.1.0 и более ранних версиях описанный выше массив назывался - $HTTP_POST_FILES и не являлся - суперглобальным, - в отличие от $_FILES. В PHP 3 массив - $HTTP_POST_FILES не определен. - - - - В случае, если register_globals - установлена значением on в конфигурационном - файле &php.ini;, будут доступны дополнительные переменные. Например, - $userfile_name будет эквивалентна переменной $_FILES['userfile']['name'], - а $userfile_type соответствует $_FILES['userfile']['type'], и так далее. - Не стоит забывать, что начиная с PHP 4.2.0 для директивы register_globals - значение по умолчанию off. Рекомендуется не полагаться на значение этой директивы. - + По умолчанию принятые файлы сохраняются на сервере в стандартной временной папке до тех пор, пока не будет задана другая директория при помощи директивы upload_tmp_dir конфигурационного файла &php.ini;. Директорию сервера по умолчанию можно сменить, установив переменную TMPDIR для - окружения, в котором выполняется PHP. Установка переменной TMPDIR при помощи + окружения, в котором выполняется PHP. Установка этой переменной при помощи функции putenv внутри PHP-скрипта работать не будет. Эта переменная окружения также может использоваться для того, чтобы удостовериться, что другие операции также работают с принятыми файлами. Проверка загружаемых на сервер файлов - Для получения более детальной информации вы можете ознакомится + Для получения более детальной информации вы можете ознакомиться с описанием функций is_uploaded_file и move_uploaded_file. Следующий пример принимает и обрабатывает загруженный при помощи формы файл. @@ -189,16 +178,16 @@ $uploaddir = '/var/www/uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); -print "
";
+echo '
';
 if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
-    print "File is valid, and was successfully uploaded. ";
-    print "Here's some more debugging info:\n";
-    print_r($_FILES);
+    echo "Файл корректен и был успешно загружен.\n";
 } else {
-    print "Possible file upload attack!  Here's some debugging info:\n";
-    print "Possible file upload attack!  Дополнительная отладочная информация:\n";
-    print_r($_FILES);
+    echo "Возможная атака с помощью файловой загрузки!\n";
 }
+
+echo 'Некоторая отладочная информация:';
+print_r($_FILES);
+
 print "
"; ?> @@ -213,9 +202,11 @@ print "
"; чтобы отсечь слишком большие или слишком маленькие файлы. Также вы можете использовать переменную $_FILES['userfile']['type'] для исключения файлов, которые не удовлетворяют критерию касательно - типа файла. Начиная с PHP 4.2.0 вы можете использовать + типа файла, однако, принимайте во внимание, что это поле полностью + контролируется клиентом, используйте его только в качестве первой + из серии проверок. Начиная с PHP 4.2.0, вы можете использовать $_FILES['userfile']['error'] и разъяснение сообщений об ошибках + linkend="features.file-upload.errors">коды ошибок при реализации вашей логики. Независимо от того, какую модель поведения вы выбрали, вы должны удалить файл из временной папки или переместить его в другую директорию. @@ -228,17 +219,53 @@ print ""; По окончанию работы скрипта, в случае, если принятый файл не был - переименован, или перемещен он будет автоматически удален из временной папки. + переименован или перемещен, он будет автоматически удален из временной папки. + + Загрузка массива файлов + + PHP поддерживает возможность передачи массива из HTML + в том числе и с файлами. + + + +

Изображения: + + + + +

+ +]]> +
+ + $error) { + if ($error == UPLOAD_ERR_OK) { + $tmp_name = $_FILES["pictures"]["tmp_name"][$key]; + $name = $_FILES["pictures"]["name"][$key]; + move_uploaded_file($tmp_name, "data/$name"); + } +} +?> +]]> + +
+ + Полоса прогресса загрузки файлов может быть реализована с помощью apc.rfc1867. +
Разъяснение сообщений об ошибках Начиная с PHP 4.2.0, PHP возвращает код ошибки наряду с другими - атрибутами принятого файла. Он расположен в массиве, создаваемом PHP + атрибутами принятого файла. Он расположен в массиве, создаваемом PHP при загрузке файла, и может быть получен при обращении по ключу - ['error']. Говоря другими словами, код ошибки можно + error. Говоря другими словами, код ошибки можно найти в переменной $_FILES['userfile']['error']. @@ -247,7 +274,7 @@ print ""; UPLOAD_ERR_OK - Значение: 0; Ошибок не возникало, файл был успешно загружен на сервер. + Значение: 0; Ошибок не возникло, файл был успешно загружен на сервер. @@ -286,6 +313,34 @@ print ""; + + UPLOAD_ERR_NO_TMP_DIR + + + Значение: 6; Отсутствует временная папка. Добавлено в PHP 4.3.10 и PHP + 5.0.3. + + + + + UPLOAD_ERR_CANT_WRITE + + + Значение: 7; Не удалось записать файл на диск. Добавлено в PHP 5.1.0. + + + + + UPLOAD_ERR_EXTENSION + + + Значение: 8; PHP-расширение остановило загрузку файла. PHP не + предоставляет способа определить какое расширение остановило + загрузку файла; в этом может помочь просмотр списка загруженных + расширений из phpinfo(). Добавлено в PHP 5.2.0. + + + @@ -300,11 +355,11 @@ print ""; Опция MAX_FILE_SIZE не должна позволять передачу файлов, размер которых превышает лимит, установленный конфигурационной директивой - upload_max_filesize. + upload_max_filesize в &php.ini;. Ограничение по умолчанию составляет 2 мегабайта. - В случае, если установлено ограничения памяти, вам может понадобиться + В случае, если установлены ограничения памяти, вам может понадобиться увеличить значение опции memory_limit. Убедитесь в том, что значение memory_limit достаточно велико. @@ -328,19 +383,30 @@ print ""; - - Директива max_input_time указывает - максимально допустимое время в секундах для получения входящих данных, - в том числе и загружаемых файлов. В случае, если вы имеете дело с несколькими - или большими файлами, либо удаленные пользователи используют медленный - канал, ограничение по умолчанию в 60 секунд может быть превышено. - - + + Директива max_input_time указывает + максимально допустимое время в секундах для получения входящих данных, + в том числе и загружаемых файлов. В случае, если вы имеете дело с несколькими + или большими файлами, либо удаленные пользователи используют медленный + канал, ограничение по умолчанию в 60 секунд может быть превышено. + + Если директива post_max_size - установлена слишком маленьким значением, большие файлы не смогут быть - загружены на сервер. Убедитесь, что значение директивы - post_max_size достаточно велико. + слишком мала, большие файлы не смогут быть загружены на сервер. + Убедитесь, что значение директивы post_max_size достаточно велико. + + + Начиная с версии PHP 5.2.12, опция + max_file_uploads + контролирует максимальное количество загружаемых файлов в течение + одного запроса. Если загружается большее количество файлов, + чем указано в этом ограничении, то массив $_FILES + прекратит дальнейшую обработку файлов по достижении этого ограничения. + Например, если + max_file_uploads установлено + в 10, то $_FILES никогда не будет + содержать больше 10 элементов. Если не проверять, с какими файлами вы работаете, пользователи могут @@ -348,19 +414,22 @@ print ""; директориях. - Следут заметить, что CERN httpd может отсечь все, что идет после первого - пробела в получаемом от клиента заголовке content-type. Если у вас именно - такой случай, CERN httpd не будет поддерживать возможность загрузки файлов. + Следут заметить, что CERN httpd может + отсечь все, что идет после первого пробела в получаемом от + клиента заголовке content-type. Если у вас именно такой случай, + CERN httpd не сможет корректно + загрузить файлы. Поскольку разные системы по-разному работают с файловой структурой, - у вас нет никаких гарантий того, что файлы с экзотическими именами + нет никаких гарантий того, что файлы с экзотическими именами (например, которые содержат пробельные символы) будут обработаны корректно. - Разработчики не должны использовать одинаковые имена для полей ввода и полей + Разработчики не должны использовать одинаковые имена для + обычных полей ввода (тег input) и полей выбора файла в пределах одной и той же формы (например, используя имя - вида foo[]). + для тега input наподобие foo[]). @@ -371,17 +440,11 @@ print ""; различные значения name для тега input. - Также предусмотрена возможность автоматического получения организованной в - массив информации о нескольких одновременно загружаемых файлах. + Также можно одновременно загружать несколько файлов и + автоматически получить их в виде массива. Для реализации такой возможности используйте тот же синтаксис отправки - массива из HTML-формы, что и для множественных полей - select и checkbox: + массива из HTML-формы, что и для множественных полей select и checkbox: - - - Поддержка загрузки нескольких файлов была добавлена в PHP 3.0.10. - - Загрузка нескольких файлов @@ -403,8 +466,8 @@ print ""; $_FILES['userfile']['name'], и $_FILES['userfile']['size'] будут инициализированы (точно так же, как и $HTTP_POST_FILES - для PHP 4.1.0 и более ранних версий). Если конфигурационная директива - register_globals установлена значением on, + для PHP 4.1.0 и более ранних версий). Если включена конфигурационная директива + register_globals, также будут инициализированы сопутствующие глобальные переменные. Каждая из таких переменных будет представлять собой численно индексированный массив соответствующих значений для принятых файлов. @@ -427,29 +490,84 @@ print ""; $_FILES['userfile']['type'][0] также будут инициализированы. + + + Начиная с версии PHP 5.2.12, конфигурационная директива + max_file_uploads + регулирует лимит одновременно загружаемых файлов в течение одного + запроса. Вам необходимо будет убедиться, что ваша форма + не пытается загрузить файлов больше этого лимита за один запрос. + + Поддержка метода PUT + + PHP поддерживает загрузку файлов методом HTTP PUT, который + используется в некоторых клиентах для загрузки файлов на сервер. + Запросы PUT намного проще, чем обыкновенная POST загрузка файла на + сервер и выглядят примерно так: + + + + + + + + Такой вызов означает, что удаленный клиент хотел бы сохранить + файл под именем /path/filename.html в + дереве каталогов вашего веб-сервера. + Очевидно, что возможность клиента автоматически перезаписывать + файлы веб-сервера при помощи Apache или PHP не является + хорошим решением. Поэтому для того, чтобы обрабатывать такие + запросы, вам необходимо указать веб-серверу PHP-скрипт, + которому вы доверяете их обработку. В веб-сервере Apache вы + можете сделать это, используя директиву Script. + Как правило, эта директива расположена внутри блока + <Directory> или же внутри блока + <VirtualHost>. Сама запись выглядит + следующим образом: + + + + + + - Поддержка метода PUT была изменена при переходе от PHP 3 к PHP 4. - В PHP 4 вы должны использовать стандартный поток ввода для чтения - файла, передаваемого методом HTTP PUT. + Это указывает веб-серверу Apache на необходимость перенаправлять + все PUT-запросы, контекст которых совпадает с контекстом, в + которым вы разместили эту строку, в файл put.php. + Предполагается, что файлы с расширением .php + обрабатываются, как PHP-скрипты, и что сам PHP установлен и работает. + Ресурсом назначения для всех PUT-запросов на этот скрипт должен быть + сам скрипт, а не имя файла, которое должен иметь загружаемый файл. + + + Внутри вашего файла put.php file вы можете поместить что-нибудь похожее на + следующий пример. Он скопирует содержимое загруженного файла в + файл myputfile.ext на сервер. Возможно, + вам понадобится осуществить несколько проверок и/или авторизовать + пользователя перед выполнением копирования этого файла. - Сохранение загруженного при помощи HTTP PUT файла в PHP 4 + Saving HTTP PUT files - - - Вся документация, приведенная ниже, касается исключительно PHP 3. - - - - PHP поддерживает загрузку файлов методом HTTP PUT, который используется в клиентах - Netscape Composer и - W3C Amaya. Запрос PUT выглядит проще, - чем в случае обыкновенной загрузки файла на сервер: - - -PUT /path/filename.html HTTP/1.1 - - - - - Такой вызов означает, что удаленный клиент хотел бы сохранить - файл под именем /path/filename.html в дереве каталогов вашего веб-сервера. - Очевидно, что возможность клиента автоматически перезаписывать файлы вашего - веб-сервера при помощи Apache или PHP не является хорошим решением. - Поэтому для того, чтобы обрабатывать такие запросы, вам необходимо указать - веб-серверу PHP-скрипт, которому вы доверяете их обработку. - В веб-сервере Apache вы можете сделать это, используя директиву - Script. Она может находиться практически - в любом месте конфигурационного файла Apache. Как правило, эта директива - расположена внутри блока <Directory> или же внутри блока - <Virtualhost>. Сама запись выглядит следующим образом: - - -Script PUT /put.php - - - - - Это указывает веб-серверу Apache на необходимость перенаправлять по - указанному адресу все PUT-запросы, контекст которых совпадает с контекстом, в - которым вы разместили эту строку. Предполагается, что файлы с расширением .php - обрабатываются, как PHP-скрипты, и что сам PHP установлен и работает. - - - Внутри вашего файла put.php file вы можете поместить что-нибудь похожее на это: - - - - -]]> - - - - Приведенный код скопирует файл в место, запрошенное клиентом. Возможно, - вы захотите выполнить какую-либо проверку и/или аутентифицировать - пользователя, прежде чем выполнять копирование. Трюк состоит в том, что - когда PHP видит PUT-запрос, он сохраняет полученный файл во временной - папке, как и при загрузке методом POST. - По окончании обработки запроса временный файл удаляется. - Поэтому ваш PHP-скрипт, обрабатывающий PUT-запрос, должен скопировать куда-либо - полученный файл. Имя временного файла хранится в переменной - $PHP_PUT_FILENAME, а предполагаемое имя файла можно найти в - переменной $REQUEST_URI (может быть другим на веб-серверах, отличных от Apache). - Запрашиваемое имя файла указывается удаленным клиентом. Вы не обязаны - следовать его указаниям. Например, вы можете скопировать все загруженные - файлы в отдельный каталог. -
@@ -541,7 +594,7 @@ sgml-indent-step:1 sgml-indent-data:t indent-tabs-mode:nil sgml-parent-document:nil -sgml-default-dtd-file:"../../manual.ced" +sgml-default-dtd-file:"~/.phpdoc/manual.ced" sgml-exposed-tags:nil sgml-local-catalogs:nil sgml-local-ecat-files:nil